Merge branch 'main' into feat/add-azure-pr
# Conflicts: # public/locales/en/common.json # src/utils/proxy/handlers/credentialed.js # src/widgets/components.js # src/widgets/widgets.js
This commit is contained in:
commit
f5bcf95e2c
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -665,6 +665,16 @@
|
|||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
},
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
|
},
|
||||||
"azurePullrequests": {
|
"azurePullrequests": {
|
||||||
"totalPrs": "Total PRs",
|
"totalPrs": "Total PRs",
|
||||||
"myPrs": "My PRs",
|
"myPrs": "My PRs",
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Serie",
|
"seriesCount": "Serie",
|
||||||
"totalFiles": "Archivos"
|
"totalFiles": "Archivos"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Séries",
|
"seriesCount": "Séries",
|
||||||
"totalFiles": "Fichiers"
|
"totalFiles": "Fichiers"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -105,7 +105,7 @@
|
|||||||
"transcoding": "Prekodiranje",
|
"transcoding": "Prekodiranje",
|
||||||
"bitrate": "Stopa bitova",
|
"bitrate": "Stopa bitova",
|
||||||
"no_active": "Nema aktivnih prijenosa",
|
"no_active": "Nema aktivnih prijenosa",
|
||||||
"plex_connection_error": "Check Plex Connection"
|
"plex_connection_error": "Provjeri Plex vezu"
|
||||||
},
|
},
|
||||||
"nzbget": {
|
"nzbget": {
|
||||||
"rate": "Stopa",
|
"rate": "Stopa",
|
||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Serije",
|
"seriesCount": "Serije",
|
||||||
"totalFiles": "Datoteke"
|
"totalFiles": "Datoteke"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Serie",
|
"seriesCount": "Serie",
|
||||||
"totalFiles": "File"
|
"totalFiles": "File"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"result": "Result",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Filer"
|
"totalFiles": "Filer"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -664,5 +664,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"inProgress": "In Progress",
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Serije",
|
"seriesCount": "Serije",
|
||||||
"totalFiles": "Datoteke"
|
"totalFiles": "Datoteke"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"totalFiles": "Files",
|
"totalFiles": "Files",
|
||||||
"seriesCount": "Series"
|
"seriesCount": "Series"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"totalFiles": "Files",
|
"totalFiles": "Files",
|
||||||
"seriesCount": "Series"
|
"seriesCount": "Series"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Серій",
|
"seriesCount": "Серій",
|
||||||
"totalFiles": "Файлів"
|
"totalFiles": "Файлів"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"failed": "Failed",
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -655,5 +655,15 @@
|
|||||||
"kavita": {
|
"kavita": {
|
||||||
"seriesCount": "Series",
|
"seriesCount": "Series",
|
||||||
"totalFiles": "Files"
|
"totalFiles": "Files"
|
||||||
|
},
|
||||||
|
"azurePipelines": {
|
||||||
|
"result": "Result",
|
||||||
|
"status": "Status",
|
||||||
|
"buildId": "Build ID",
|
||||||
|
"succeeded": "Succeeded",
|
||||||
|
"notStarted": "Not Started",
|
||||||
|
"failed": "Failed",
|
||||||
|
"canceled": "Canceled",
|
||||||
|
"inProgress": "In Progress"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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.mnt_point} 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.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>;
|
||||||
@ -50,7 +50,7 @@ export default function Widget({ options }) {
|
|||||||
if (options.cputemp && cpuSensors) {
|
if (options.cputemp && cpuSensors) {
|
||||||
try {
|
try {
|
||||||
mainTemp = cpuSensors.reduce((acc, s) => acc + s.value, 0) / cpuSensors.length;
|
mainTemp = cpuSensors.reduce((acc, s) => acc + s.value, 0) / cpuSensors.length;
|
||||||
maxTemp = Math.max(cpuSensors.reduce((acc, s) => acc + s.warning, 0) / cpuSensors.length, maxTemp);
|
maxTemp = Math.max(cpuSensors.reduce((acc, s) => acc + (s.warning > 0 ? s.warning : 0), 0) / cpuSensors.length, maxTemp);
|
||||||
if (unit === "fahrenheit") {
|
if (unit === "fahrenheit") {
|
||||||
mainTemp = convertToFahrenheit(mainTemp);
|
mainTemp = convertToFahrenheit(mainTemp);
|
||||||
maxTemp = convertToFahrenheit(maxTemp);
|
maxTemp = convertToFahrenheit(maxTemp);
|
||||||
@ -108,7 +108,7 @@ export default function Widget({ options }) {
|
|||||||
expanded={options.expanded}
|
expanded={options.expanded}
|
||||||
/>
|
/>
|
||||||
{disks.map((disk) => (
|
{disks.map((disk) => (
|
||||||
<Resource key={disk.mnt_point}
|
<Resource key={`disk_${disk.mnt_point}`}
|
||||||
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")}
|
||||||
|
|||||||
@ -10,6 +10,7 @@ export default function Logo({ options }) {
|
|||||||
{options.icon ?
|
{options.icon ?
|
||||||
<ResolvedIcon icon={options.icon} width={48} height={48} /> :
|
<ResolvedIcon icon={options.icon} width={48} height={48} /> :
|
||||||
// fallback to homepage logo
|
// fallback to homepage logo
|
||||||
|
<div className="w-12 h-12">
|
||||||
<svg
|
<svg
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
viewBox="0 0 1024 1024"
|
viewBox="0 0 1024 1024"
|
||||||
@ -60,6 +61,7 @@ export default function Logo({ options }) {
|
|||||||
/>
|
/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
</Raw>
|
</Raw>
|
||||||
</Container>
|
</Container>
|
||||||
|
|||||||
@ -1,7 +0,0 @@
|
|||||||
import mapIcon from "utils/weather/openmeteo-condition-map";
|
|
||||||
|
|
||||||
export default function Icon({ condition, timeOfDay }) {
|
|
||||||
const IconComponent = mapIcon(condition, timeOfDay);
|
|
||||||
|
|
||||||
return <IconComponent className="w-10 h-10 text-theme-800 dark:text-theme-200" />;
|
|
||||||
}
|
|
||||||
@ -10,8 +10,7 @@ import ContainerButton from "../widget/container_button";
|
|||||||
import WidgetIcon from "../widget/widget_icon";
|
import WidgetIcon from "../widget/widget_icon";
|
||||||
import PrimaryText from "../widget/primary_text";
|
import PrimaryText from "../widget/primary_text";
|
||||||
import SecondaryText from "../widget/secondary_text";
|
import SecondaryText from "../widget/secondary_text";
|
||||||
|
import mapIcon from "../../../utils/weather/openmeteo-condition-map";
|
||||||
import Icon from "./icon";
|
|
||||||
|
|
||||||
function Widget({ options }) {
|
function Widget({ options }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@ -33,10 +32,8 @@ function Widget({ options }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
|
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
|
||||||
const weatherInfo = {
|
const condition = data.current_weather.weathercode;
|
||||||
condition: data.current_weather.weathercode,
|
const timeOfDay = data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night";
|
||||||
timeOfDay: data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night"
|
|
||||||
};
|
|
||||||
|
|
||||||
return <Container options={options}>
|
return <Container options={options}>
|
||||||
<PrimaryText>
|
<PrimaryText>
|
||||||
@ -47,8 +44,8 @@ function Widget({ options }) {
|
|||||||
unit,
|
unit,
|
||||||
})}
|
})}
|
||||||
</PrimaryText>
|
</PrimaryText>
|
||||||
<SecondaryText>{t(`wmo.${data.current_weather.weathercode}-${weatherInfo.timeOfDay}`)}</SecondaryText>
|
<SecondaryText>{t(`wmo.${data.current_weather.weathercode}-${timeOfDay}`)}</SecondaryText>
|
||||||
<WidgetIcon icon={Icon} size="xl" weatherInfo={weatherInfo} />
|
<WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
|
||||||
</Container>;
|
</Container>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +0,0 @@
|
|||||||
import mapIcon from "utils/weather/owm-condition-map";
|
|
||||||
|
|
||||||
export default function Icon({ condition, timeOfDay }) {
|
|
||||||
const IconComponent = mapIcon(condition, timeOfDay);
|
|
||||||
|
|
||||||
return <IconComponent className="w-10 h-10 text-theme-800 dark:text-theme-200" />;
|
|
||||||
}
|
|
||||||
@ -10,9 +10,7 @@ import ContainerButton from "../widget/container_button";
|
|||||||
import PrimaryText from "../widget/primary_text";
|
import PrimaryText from "../widget/primary_text";
|
||||||
import SecondaryText from "../widget/secondary_text";
|
import SecondaryText from "../widget/secondary_text";
|
||||||
import WidgetIcon from "../widget/widget_icon";
|
import WidgetIcon from "../widget/widget_icon";
|
||||||
|
import mapIcon from "../../../utils/weather/owm-condition-map";
|
||||||
import Icon from "./icon";
|
|
||||||
|
|
||||||
|
|
||||||
function Widget({ options }) {
|
function Widget({ options }) {
|
||||||
const { t, i18n } = useTranslation();
|
const { t, i18n } = useTranslation();
|
||||||
@ -35,15 +33,13 @@ function Widget({ options }) {
|
|||||||
|
|
||||||
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
|
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
|
||||||
|
|
||||||
const weatherInfo = {
|
const condition = data.weather[0].id;
|
||||||
condition: data.weather[0].id,
|
const timeOfDay = data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night";
|
||||||
timeOfDay: data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night"
|
|
||||||
};
|
|
||||||
|
|
||||||
return <Container options={options}>
|
return <Container options={options}>
|
||||||
<PrimaryText>{options.label && `${options.label}, ` }{t("common.number", { value: data.main.temp, style: "unit", unit })}</PrimaryText>
|
<PrimaryText>{options.label && `${options.label}, ` }{t("common.number", { value: data.main.temp, style: "unit", unit })}</PrimaryText>
|
||||||
<SecondaryText>{data.weather[0].description}</SecondaryText>
|
<SecondaryText>{data.weather[0].description}</SecondaryText>
|
||||||
<WidgetIcon icon={Icon} size="xl" weatherInfo={weatherInfo} />
|
<WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
|
||||||
</Container>;
|
</Container>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +0,0 @@
|
|||||||
import mapIcon from "utils/weather/condition-map";
|
|
||||||
|
|
||||||
export default function Icon({ condition, timeOfDay }) {
|
|
||||||
const IconComponent = mapIcon(condition, timeOfDay);
|
|
||||||
|
|
||||||
return <IconComponent className="w-10 h-10 text-theme-800 dark:text-theme-200" />;
|
|
||||||
}
|
|
||||||
@ -10,8 +10,7 @@ import PrimaryText from "../widget/primary_text";
|
|||||||
import SecondaryText from "../widget/secondary_text";
|
import SecondaryText from "../widget/secondary_text";
|
||||||
import WidgetIcon from "../widget/widget_icon";
|
import WidgetIcon from "../widget/widget_icon";
|
||||||
import ContainerButton from "../widget/container_button";
|
import ContainerButton from "../widget/container_button";
|
||||||
|
import mapIcon from "../../../utils/weather/condition-map";
|
||||||
import Icon from "./icon";
|
|
||||||
|
|
||||||
function Widget({ options }) {
|
function Widget({ options }) {
|
||||||
const { t, i18n } = useTranslation();
|
const { t, i18n } = useTranslation();
|
||||||
@ -33,10 +32,8 @@ function Widget({ options }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
|
const unit = options.units === "metric" ? "celsius" : "fahrenheit";
|
||||||
const weatherInfo = {
|
const condition = data.current.condition.code;
|
||||||
condition: data.current.condition.code,
|
const timeOfDay = data.current.is_day ? "day" : "night";
|
||||||
timeOfDay: data.current.is_day ? "day" : "night",
|
|
||||||
};
|
|
||||||
|
|
||||||
return <Container options={options}>
|
return <Container options={options}>
|
||||||
<PrimaryText>
|
<PrimaryText>
|
||||||
@ -48,7 +45,7 @@ function Widget({ options }) {
|
|||||||
})}
|
})}
|
||||||
</PrimaryText>
|
</PrimaryText>
|
||||||
<SecondaryText>{data.current.condition.text}</SecondaryText>
|
<SecondaryText>{data.current.condition.text}</SecondaryText>
|
||||||
<WidgetIcon icon={Icon} size="xl" weatherInfo={weatherInfo} />
|
<WidgetIcon icon={mapIcon(condition, timeOfDay)} size="xl" />
|
||||||
</Container>;
|
</Container>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
export default function WidgetIcon({ icon, size = "s", pulse = false, weatherInfo = {} }) {
|
export default function WidgetIcon({ icon, size = "s", pulse = false }) {
|
||||||
const Icon = icon;
|
const Icon = icon;
|
||||||
const { condition, timeOfDay } = weatherInfo;
|
|
||||||
let additionalClasses = "text-theme-800 dark:text-theme-200 ";
|
let additionalClasses = "text-theme-800 dark:text-theme-200 ";
|
||||||
|
|
||||||
switch (size) {
|
switch (size) {
|
||||||
@ -14,5 +13,5 @@ export default function WidgetIcon({ icon, size = "s", pulse = false, weatherInf
|
|||||||
additionalClasses += "animate-pulse ";
|
additionalClasses += "animate-pulse ";
|
||||||
}
|
}
|
||||||
|
|
||||||
return <Icon className={additionalClasses} condition={condition} timeOfDay={timeOfDay} />;
|
return <Icon className={additionalClasses} />;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -290,6 +290,7 @@ export function cleanServiceGroups(groups) {
|
|||||||
enableNowPlaying,
|
enableNowPlaying,
|
||||||
volume, // diskstation widget,
|
volume, // diskstation widget,
|
||||||
enableQueue, // sonarr/radarr
|
enableQueue, // sonarr/radarr
|
||||||
|
node, // Proxmox
|
||||||
} = cleanedService.widget;
|
} = cleanedService.widget;
|
||||||
|
|
||||||
let fieldsList = fields;
|
let fieldsList = fields;
|
||||||
@ -323,6 +324,9 @@ export function cleanServiceGroups(groups) {
|
|||||||
if (type === "unifi") {
|
if (type === "unifi") {
|
||||||
if (site) cleanedService.widget.site = site;
|
if (site) cleanedService.widget.site = site;
|
||||||
}
|
}
|
||||||
|
if (type === "proxmox") {
|
||||||
|
if (node) cleanedService.widget.node = node;
|
||||||
|
}
|
||||||
if (type === "kubernetes") {
|
if (type === "kubernetes") {
|
||||||
if (namespace) cleanedService.widget.namespace = namespace;
|
if (namespace) cleanedService.widget.namespace = namespace;
|
||||||
if (app) cleanedService.widget.app = app;
|
if (app) cleanedService.widget.app = app;
|
||||||
|
|||||||
@ -62,7 +62,7 @@ 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 === "azurePullrequests") {
|
else if (widget.type === "azurePipelines" || widget.type === "azurePullrequests") {
|
||||||
headers.Authorization = `Basic ${Buffer.from(`$:${widget.key}`).toString("base64")}`;
|
headers.Authorization = `Basic ${Buffer.from(`$:${widget.key}`).toString("base64")}`;
|
||||||
} else {
|
} else {
|
||||||
headers["X-API-Key"] = `${widget.key}`;
|
headers["X-API-Key"] = `${widget.key}`;
|
||||||
|
|||||||
36
src/widgets/azurePipelines/component.jsx
Normal file
36
src/widgets/azurePipelines/component.jsx
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
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>
|
||||||
|
);
|
||||||
|
}
|
||||||
8
src/widgets/azurePipelines/widget.js
Normal file
8
src/widgets/azurePipelines/widget.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
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;
|
||||||
@ -5,6 +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")),
|
||||||
azurePullrequests: dynamic(() => import("./azurePullrequests/component")),
|
azurePullrequests: dynamic(() => import("./azurePullrequests/component")),
|
||||||
bazarr: dynamic(() => import("./bazarr/component")),
|
bazarr: dynamic(() => import("./bazarr/component")),
|
||||||
caddy: dynamic(() => import("./caddy/component")),
|
caddy: dynamic(() => import("./caddy/component")),
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import Container from "components/services/widget/container";
|
|||||||
import Block from "components/services/widget/block";
|
import Block from "components/services/widget/block";
|
||||||
import useWidgetAPI from "utils/proxy/use-widget-api";
|
import useWidgetAPI from "utils/proxy/use-widget-api";
|
||||||
|
|
||||||
|
|
||||||
function calcRunning(total, current) {
|
function calcRunning(total, current) {
|
||||||
return current.status === "running" ? total + 1 : total;
|
return current.status === "running" ? total + 1 : total;
|
||||||
}
|
}
|
||||||
@ -25,29 +26,40 @@ export default function Component({ service }) {
|
|||||||
<Block label="proxmox.vms" />
|
<Block label="proxmox.vms" />
|
||||||
<Block label="proxmox.lxc" />
|
<Block label="proxmox.lxc" />
|
||||||
<Block label="resources.cpu" />
|
<Block label="resources.cpu" />
|
||||||
<Block label="resources.ram" />
|
<Block label="resources.mem" />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data } = clusterData ;
|
const { data } = clusterData ;
|
||||||
const vms = data.filter(item => item.type === "qemu" && item.template === 0) || [];
|
const vms = data.filter(item => item.type === "qemu" && item.template === 0 && (widget.node === undefined || widget.node === item.node)) || [];
|
||||||
const lxc = data.filter(item => item.type === "lxc" && item.template === 0) || [];
|
const lxc = data.filter(item => item.type === "lxc" && item.template === 0 && (widget.node === undefined || widget.node === item.node)) || [];
|
||||||
const nodes = data.filter(item => item.type === "node") || [];
|
const nodes = data.filter(item => item.type === "node" && (widget.node === undefined || widget.node === item.node)) || [];
|
||||||
|
|
||||||
const runningVMs = vms.reduce(calcRunning, 0);
|
const runningVMs = vms.reduce(calcRunning, 0);
|
||||||
const runningLXC = lxc.reduce(calcRunning, 0);
|
const runningLXC = lxc.reduce(calcRunning, 0);
|
||||||
|
|
||||||
// TODO: support more than one node
|
if (nodes.length === 0) {
|
||||||
// TODO: better handling of cluster with zero nodes
|
return (
|
||||||
const node = nodes.length > 0 ? nodes[0] : { cpu: 0.0, mem: 0, maxmem: 0 };
|
<Container service={service}>
|
||||||
|
<Block label="proxmox.vms" value={`${runningVMs} / ${vms.length}`} />
|
||||||
|
<Block label="proxmox.lxc" value={`${runningLXC} / ${lxc.length}`} />
|
||||||
|
<Block label="resources.cpu" />
|
||||||
|
<Block label="resources.mem" />
|
||||||
|
</Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const maxMemory = nodes.reduce((sum, n) => n.maxmem + sum, 0);
|
||||||
|
const usedMemory = nodes.reduce((sum, n) => n.mem + sum, 0);
|
||||||
|
const maxCpu = nodes.reduce((sum, n) => n.maxcpu + sum, 0);
|
||||||
|
const usedCpu = nodes.reduce((sum, n) => (n.cpu * n.maxcpu) + sum, 0);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container service={service}>
|
<Container service={service}>
|
||||||
<Block label="proxmox.vms" value={`${runningVMs} / ${vms.length}`} />
|
<Block label="proxmox.vms" value={`${runningVMs} / ${vms.length}`} />
|
||||||
<Block label="proxmox.lxc" value={`${runningLXC} / ${lxc.length}`} />
|
<Block label="proxmox.lxc" value={`${runningLXC} / ${lxc.length}`} />
|
||||||
<Block label="resources.cpu" value={t("common.percent", { value: (node.cpu * 100) })} />
|
<Block label="resources.cpu" value={t("common.percent", { value: ((usedCpu / maxCpu) * 100) })} />
|
||||||
<Block label="resources.mem" value={t("common.percent", { value: ((node.mem / node.maxmem) * 100) })} />
|
<Block label="resources.mem" value={t("common.percent", { value: ((usedMemory / maxMemory) * 100) })} />
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +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 azurePullrequests from "./azurePullrequests/widget";
|
import azurePullrequests from "./azurePullrequests/widget";
|
||||||
import bazarr from "./bazarr/widget";
|
import bazarr from "./bazarr/widget";
|
||||||
import caddy from "./caddy/widget";
|
import caddy from "./caddy/widget";
|
||||||
@ -92,6 +93,7 @@ const widgets = {
|
|||||||
audiobookshelf,
|
audiobookshelf,
|
||||||
authentik,
|
authentik,
|
||||||
autobrr,
|
autobrr,
|
||||||
|
azurePipelines,
|
||||||
azurePullrequests,
|
azurePullrequests,
|
||||||
bazarr,
|
bazarr,
|
||||||
caddy,
|
caddy,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user