From caa1b94fd6c435ddc486d216cfc0f15ffdde9805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Y=C4=B1ld=C4=B1r=C4=B1m=20Manisal=C4=B1?= Date: Wed, 31 May 2023 11:17:39 +0000 Subject: [PATCH 001/207] Translated using Weblate (Turkish) Currently translated at 85.4% (394 of 461 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/ --- public/locales/tr/common.json | 158 +++++++++++++++++----------------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index d5be780e..a2a872f4 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -24,13 +24,13 @@ "used": "Kullanımda", "load": "Yük", "mem": "MEM", - "temp": "TEMP", - "max": "Max", - "uptime": "UP", - "months": "mo", - "days": "d", - "hours": "h", - "minutes": "m" + "temp": "Geçici", + "max": "En Yüksek", + "uptime": "Çalışma Süresi", + "months": "Ay", + "days": "Gün", + "hours": "Saat", + "minutes": "Dakika" }, "unifi": { "users": "Kullanıcılar", @@ -57,23 +57,23 @@ "offline": "Çevrimdışı", "error": "Hata", "unknown": "Bilinmiyor", - "running": "Running", - "starting": "Starting", - "unhealthy": "Unhealthy", - "not_found": "Not Found", - "exited": "Exited", - "partial": "Partial", - "healthy": "Healthy" + "running": "Çalışan", + "starting": "Başlatılıyor", + "unhealthy": "Sağlıksız", + "not_found": "Bulunamadı", + "exited": "Durduruldu", + "partial": "Parçalı", + "healthy": "Sağlık" }, "emby": { "playing": "Oynatılıyor", "transcoding": "Dönüştürülüyor", "bitrate": "Bit Oranı", "no_active": "Aktif akış yok", - "movies": "Movies", - "series": "Series", - "episodes": "Episodes", - "songs": "Songs" + "movies": "Filmler", + "series": "Diziler", + "episodes": "Bölümler", + "songs": "Şarkılar" }, "tautulli": { "playing": "Oynatılıyor", @@ -90,7 +90,7 @@ "streams": "Aktif Akış", "movies": "Filmler", "tv": "TV Showları", - "albums": "Albums" + "albums": "Albümler" }, "sabnzbd": { "rate": "Oran", @@ -159,7 +159,7 @@ "queries": "Sorgular", "blocked": "Engellenen", "gravity": "Yer Çekimi", - "blocked_percent": "Blocked %" + "blocked_percent": "Engellenen %" }, "adguard": { "queries": "Sorgular", @@ -235,15 +235,15 @@ "glances": { "cpu": "İşlemci", "wait": "Lütfen bekleyiniz", - "temp": "TEMP", - "uptime": "UP", - "days": "d", - "hours": "h", - "load": "Load", - "warn": "Warn", - "total": "Total", - "free": "Free", - "used": "Used" + "temp": "Sıcaklık", + "uptime": "Çalışma Süresi", + "days": "Gün", + "hours": "Saat", + "load": "Yük", + "warn": "Uyarı", + "total": "Toplam", + "free": "Boş", + "used": "Kullanım" }, "changedetectionio": { "totalObserved": "Toplam Gözlenen", @@ -311,9 +311,9 @@ "bookmark": "Yer İmi", "service": "Hizmet", "search": "Ara", - "custom": "Custom", - "visit": "Visit", - "url": "URL" + "custom": "Özel", + "visit": "Ziyaret", + "url": "Link" }, "homebridge": { "available_update": "Sistem", @@ -384,14 +384,14 @@ "deluge": { "download": "İndir", "upload": "Yükle", - "leech": "Leech", + "leech": "Tüketici", "seed": "Tohum" }, "flood": { "download": "İndir", "upload": "Yükle", - "leech": "Leech", - "seed": "Tohum" + "leech": "Tüketici", + "seed": "Sağlayıcı" }, "tdarr": { "queue": "Sıra", @@ -421,7 +421,7 @@ "downloadstation": { "download": "İndir", "upload": "Yükle", - "leech": "Leech", + "leech": "Tüketici", "seed": "Tohum" }, "mikrotik": { @@ -448,7 +448,7 @@ "layers": "Katmanlar" }, "medusa": { - "wanted": "Wanted", + "wanted": "Aranan", "queued": "Kuyrukta", "series": "Seri" }, @@ -554,11 +554,11 @@ "targets_total": "Total Targets" }, "minecraft": { - "players": "Players", - "version": "Version", - "status": "Status", - "up": "Online", - "down": "Offline" + "players": "Oyuncular", + "version": "Versiyon", + "status": "Durum", + "up": "Çevrimiçi", + "down": "Çevrimdışı" }, "ghostfolio": { "gross_percent_today": "Today", @@ -577,40 +577,40 @@ "switches_on": "Switches On" }, "freshrss": { - "subscriptions": "Subscriptions", - "unread": "Unread" + "subscriptions": "Abonelikler", + "unread": "Okunmamış" }, "channelsdvrserver": { - "shows": "Shows", - "recordings": "Recordings", - "scheduled": "Scheduled", - "passes": "Passes" + "shows": "Diziler", + "recordings": "Kayıtlar", + "scheduled": "Planlanmış", + "passes": "Geçilenler" }, "whatsupdocker": { "monitoring": "Monitoring", "updates": "Updates" }, "tailscale": { - "never": "Never", - "last_seen": "Last Seen", - "now": "Now", - "years": "{{number}}y", - "weeks": "{{number}}w", - "days": "{{number}}d", - "hours": "{{number}}h", - "minutes": "{{number}}m", - "seconds": "{{number}}s", - "ago": "{{value}} Ago", - "address": "Address", - "expires": "Expires" + "never": "Asla", + "last_seen": "Son Görülme", + "now": "Şimdi", + "years": "{{number}} Yıl", + "weeks": "{{number}} Hafta", + "days": "{{number}} Gün", + "hours": "{{number}} Saat", + "minutes": "{{number}} Dakika", + "seconds": "{{number}} Saniye", + "ago": "{{value}} Önce", + "address": "Adres", + "expires": "Geciken" }, "qnap": { - "cpuUsage": "CPU Usage", - "memUsage": "MEM Usage", - "systemTempC": "System Temp", - "poolUsage": "Pool Usage", - "volumeUsage": "Volume Usage", - "invalid": "Invalid" + "cpuUsage": "İşlemci Kullanımı", + "memUsage": "Bellek Kullanımı", + "systemTempC": "Sistem Sıcaklığı", + "poolUsage": "Havuz Kullanımı", + "volumeUsage": "Alan Kullanımı", + "invalid": "Geçersiz" }, "pfsense": { "load": "Load Avg", @@ -623,22 +623,22 @@ "wanIP": "WAN IP" }, "caddy": { - "upstreams": "Upstreams", - "requests": "Current requests", - "requests_failed": "Failed requests" + "upstreams": "Akış", + "requests": "Anlık İstekler", + "requests_failed": "Başarısız İstekler" }, "evcc": { - "pv_power": "Production", - "battery_soc": "Battery", - "grid_power": "Grid", - "home_power": "Consumption", - "charge_power": "Charger", - "watt_hour": "Wh" + "pv_power": "Üretim", + "battery_soc": "Batarya", + "grid_power": "Güç", + "home_power": "Tüketim", + "charge_power": "Şarj", + "watt_hour": "Watt/Saat" }, "pialert": { - "total": "Total", - "connected": "Connected", - "new_devices": "New Devices", - "down_alerts": "Down Alerts" + "total": "Toplam", + "connected": "Bağlandı", + "new_devices": "Yeni Cihazlar", + "down_alerts": "Düşme Uyarıları" } } From 28e39e46ae949f0fb57872575bdbeee9aba8f40e Mon Sep 17 00:00:00 2001 From: Matteo Bossi Date: Fri, 2 Jun 2023 14:57:27 +0200 Subject: [PATCH 002/207] Add queue list --- src/components/services/widget/block-list.jsx | 31 ++++++++ src/components/services/widget/container.jsx | 6 +- src/widgets/radarr/component.jsx | 79 +++++++++++++++---- src/widgets/radarr/widget.js | 33 +++++++- src/widgets/sonarr/component.jsx | 75 +++++++++++++++--- src/widgets/sonarr/widget.js | 39 ++++++++- tailwind.config.js | 3 + 7 files changed, 232 insertions(+), 34 deletions(-) create mode 100644 src/components/services/widget/block-list.jsx diff --git a/src/components/services/widget/block-list.jsx b/src/components/services/widget/block-list.jsx new file mode 100644 index 00000000..138576bc --- /dev/null +++ b/src/components/services/widget/block-list.jsx @@ -0,0 +1,31 @@ +import { useTranslation } from "next-i18next"; +import { useCallback, useState } from 'react'; +import classNames from "classnames"; + +import ResolvedIcon from '../../resolvedicon'; + + +export default function BlockList({ label, children, childHeight }) { + const { t } = useTranslation(); + const [isOpen, setOpen] = useState(false); + + const changeState = useCallback(() => setOpen(!isOpen), [isOpen, setOpen]); + + return ( +
+ +
+ {children} +
+
+ ); +} diff --git a/src/components/services/widget/container.jsx b/src/components/services/widget/container.jsx index f4d8c13e..4b8a06ca 100644 --- a/src/components/services/widget/container.jsx +++ b/src/components/services/widget/container.jsx @@ -15,7 +15,9 @@ export default function Container({ error = false, children, service }) { return } - let visibleChildren = children; + const childrenArray = Array.isArray(children) ? children : [children]; + + let visibleChildren = childrenArray; const fields = service?.widget?.fields; const type = service?.widget?.type; if (fields && type) { @@ -24,7 +26,7 @@ export default function Container({ error = false, children, service }) { // fields: [ "resources.cpu", "resources.mem", "field"] // or even // fields: [ "resources.cpu", "widget_type.field" ] - visibleChildren = children?.filter(child => fields.some(field => { + visibleChildren = childrenArray?.filter(child => fields.some(field => { let fullField = field; if (!field.includes(".")) { fullField = `${type}.${field}`; diff --git a/src/widgets/radarr/component.jsx b/src/widgets/radarr/component.jsx index f8a932ea..4e53ef9a 100644 --- a/src/widgets/radarr/component.jsx +++ b/src/widgets/radarr/component.jsx @@ -1,7 +1,10 @@ import { useTranslation } from "next-i18next"; +import { useCallback } from 'react'; +import classNames from 'classnames'; import Container from "components/services/widget/container"; import Block from "components/services/widget/block"; +import BlockList from "components/services/widget/block-list"; import useWidgetAPI from "utils/proxy/use-widget-api"; export default function Component({ service }) { @@ -10,29 +13,75 @@ export default function Component({ service }) { const { data: moviesData, error: moviesError } = useWidgetAPI(widget, "movie"); const { data: queuedData, error: queuedError } = useWidgetAPI(widget, "queue/status"); + const { data: queueDetailsData, error: queueDetailsError } = useWidgetAPI(widget, "queue/details"); - if (moviesError || queuedError) { - const finalError = moviesError ?? queuedError; + // information taken from the Radarr docs: https://radarr.video/docs/api/ + const formatDownloadState = useCallback((downloadState) => { + switch (downloadState) { + case "importPending": + return "import pending"; + case "failedPending": + return "failed pending"; + default: + return downloadState; + } + }, []); + + if (moviesError || queuedError || queueDetailsError) { + const finalError = moviesError ?? queuedError ?? queueDetailsError; return ; } - if (!moviesData || !queuedData) { + if (!moviesData || !queuedData || !queueDetailsData) { return ( - - - - - - + <> + + + + + + + + + + ); } return ( - - - - - - + <> + + + + + + + + + {Array.isArray(queueDetailsData) ? queueDetailsData.map((queueEntry) => ( +
+
+
{moviesData.all.find((entry) => entry.id === queueEntry.movieId)?.title}
+
{formatDownloadState(queueEntry.trackedDownloadState)}
+
+
+
+
+
+
{queueEntry.timeLeft}
+
+
+ )) : undefined} + + + ); } diff --git a/src/widgets/radarr/widget.js b/src/widgets/radarr/widget.js index 78054219..0f53ab14 100644 --- a/src/widgets/radarr/widget.js +++ b/src/widgets/radarr/widget.js @@ -1,5 +1,5 @@ import genericProxyHandler from "utils/proxy/handlers/generic"; -import { jsonArrayFilter } from "utils/proxy/api-helpers"; +import { asJson, jsonArrayFilter } from "utils/proxy/api-helpers"; const widget = { api: "{url}/api/v3/{endpoint}?apikey={key}", @@ -12,6 +12,7 @@ const widget = { wanted: jsonArrayFilter(data, (item) => item.monitored && !item.hasFile && item.isAvailable).length, have: jsonArrayFilter(data, (item) => item.hasFile).length, missing: jsonArrayFilter(data, (item) => item.monitored && !item.hasFile).length, + all: asJson(data), }), }, "queue/status": { @@ -20,6 +21,36 @@ const widget = { "totalCount" ] }, + "queue/details": { + endpoint: "queue/details", + map: (data) => asJson(data).map((entry) => ({ + trackedDownloadState: entry.trackedDownloadState, + trackedDownloadStatus: entry.trackedDownloadStatus, + timeLeft: entry.timeleft, + size: entry.size, + sizeLeft: entry.sizeleft, + movieId: entry.movieId + })).sort((a, b) => { + const downloadingA = a.trackedDownloadState === "downloading" + const downloadingB = b.trackedDownloadState === "downloading" + if (downloadingA && !downloadingB) { + return -1; + } + if (downloadingB && !downloadingA) { + return 1; + } + + const percentA = a.sizeLeft / a.size; + const percentB = b.sizeLeft / b.size; + if (percentA < percentB) { + return -1; + } + if (percentA > percentB) { + return 1; + } + return 0; + }) + }, }, }; diff --git a/src/widgets/sonarr/component.jsx b/src/widgets/sonarr/component.jsx index adbb8c30..9a0f98ae 100644 --- a/src/widgets/sonarr/component.jsx +++ b/src/widgets/sonarr/component.jsx @@ -1,8 +1,11 @@ import { useTranslation } from "next-i18next"; +import classNames from 'classnames'; +import { useCallback } from 'react'; import Container from "components/services/widget/container"; import Block from "components/services/widget/block"; import useWidgetAPI from "utils/proxy/use-widget-api"; +import BlockList from 'components/services/widget/block-list'; export default function Component({ service }) { const { t } = useTranslation(); @@ -11,27 +14,73 @@ export default function Component({ service }) { const { data: wantedData, error: wantedError } = useWidgetAPI(widget, "wanted/missing"); const { data: queuedData, error: queuedError } = useWidgetAPI(widget, "queue"); const { data: seriesData, error: seriesError } = useWidgetAPI(widget, "series"); + const { data: queueDetailsData, error: queueDetailsError } = useWidgetAPI(widget, "queue/details"); - if (wantedError || queuedError || seriesError) { - const finalError = wantedError ?? queuedError ?? seriesError; + // information taken from the Sonarr docs: https://sonarr.tv/docs/api/ + const formatDownloadState = useCallback((downloadState) => { + switch (downloadState) { + case "importPending": + return "import pending"; + case "failedPending": + return "failed pending"; + default: + return downloadState; + } + }, []); + + if (wantedError || queuedError || seriesError || queueDetailsError) { + const finalError = wantedError ?? queuedError ?? seriesError ?? queueDetailsError; return ; } - if (!wantedData || !queuedData || !seriesData) { + if (!wantedData || !queuedData || !seriesData || !queueDetailsData) { return ( - - - - - + <> + + + + + + + + + ); } return ( - - - - - + <> + + + + + + + + {Array.isArray(queueDetailsData) ? queueDetailsData.map((queueEntry) => ( +
+
+
{seriesData.find((entry) => entry.id === queueEntry.seriesId).title} • {queueEntry.episodeTitle}
+
{formatDownloadState(queueEntry.trackedDownloadState)}
+
+
+
+
+
+
{queueEntry.timeLeft}
+
+
+ )) : undefined} + + + ); } diff --git a/src/widgets/sonarr/widget.js b/src/widgets/sonarr/widget.js index c1413975..80afdb99 100644 --- a/src/widgets/sonarr/widget.js +++ b/src/widgets/sonarr/widget.js @@ -8,9 +8,10 @@ const widget = { mappings: { series: { endpoint: "series", - map: (data) => ({ - total: asJson(data).length, - }) + map: (data) => asJson(data).map((entry) => ({ + title: entry.title, + id: entry.id + })) }, queue: { endpoint: "queue", @@ -24,6 +25,38 @@ const widget = { "totalRecords" ] }, + "queue/details": { + endpoint: "queue/details", + map: (data) => asJson(data).map((entry) => ({ + trackedDownloadState: entry.trackedDownloadState, + trackedDownloadStatus: entry.trackedDownloadStatus, + timeLeft: entry.timeleft, + size: entry.size, + sizeLeft: entry.sizeleft, + seriesId: entry.seriesId, + episodeTitle: entry.episode?.title, + episodeId: entry.episodeId + })).sort((a, b) => { + const downloadingA = a.trackedDownloadState === "downloading" + const downloadingB = b.trackedDownloadState === "downloading" + if (downloadingA && !downloadingB) { + return -1; + } + if (downloadingB && !downloadingA) { + return 1; + } + + const percentA = a.sizeLeft / a.size; + const percentB = b.sizeLeft / b.size; + if (percentA < percentB) { + return -1; + } + if (percentA > percentB) { + return 1; + } + return 0; + }) + } }, }; diff --git a/tailwind.config.js b/tailwind.config.js index b981051b..96c9e641 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -29,6 +29,9 @@ module.exports = { '3xl': '1800px', // => @media (min-width: 1800px) { ... } }, + transitionProperty: { + 'height': 'height' + }, }, }, plugins: [tailwindForms, tailwindScrollbars], From 0eab4e79437e61d3f0a12cbd2bab415d5f856df0 Mon Sep 17 00:00:00 2001 From: Matteo Bossi Date: Fri, 2 Jun 2023 15:46:43 +0200 Subject: [PATCH 003/207] Fix Mobile view --- src/widgets/radarr/component.jsx | 4 +++- src/widgets/sonarr/component.jsx | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/widgets/radarr/component.jsx b/src/widgets/radarr/component.jsx index 4e53ef9a..2e58bf9d 100644 --- a/src/widgets/radarr/component.jsx +++ b/src/widgets/radarr/component.jsx @@ -61,7 +61,9 @@ export default function Component({ service }) { {Array.isArray(queueDetailsData) ? queueDetailsData.map((queueEntry) => (
-
{moviesData.all.find((entry) => entry.id === queueEntry.movieId)?.title}
+
+
{moviesData.all.find((entry) => entry.id === queueEntry.movieId)?.title}
+
{formatDownloadState(queueEntry.trackedDownloadState)}
diff --git a/src/widgets/sonarr/component.jsx b/src/widgets/sonarr/component.jsx index 9a0f98ae..ee548b58 100644 --- a/src/widgets/sonarr/component.jsx +++ b/src/widgets/sonarr/component.jsx @@ -60,7 +60,9 @@ export default function Component({ service }) { {Array.isArray(queueDetailsData) ? queueDetailsData.map((queueEntry) => (
-
{seriesData.find((entry) => entry.id === queueEntry.seriesId).title} • {queueEntry.episodeTitle}
+
+
{seriesData.find((entry) => entry.id === queueEntry.seriesId).title} • {queueEntry.episodeTitle}
+
{formatDownloadState(queueEntry.trackedDownloadState)}
From c79d45f91e775b0d2eed070263021d0cffe695c9 Mon Sep 17 00:00:00 2001 From: Denis Papec Date: Sun, 16 Apr 2023 00:05:50 +0100 Subject: [PATCH 004/207] Add optional boxed styling and error component to information widgets Signed-off-by: Denis Papec --- src/components/widgets/datetime/datetime.jsx | 8 +++-- src/components/widgets/error.jsx | 23 +++++++++++++ src/components/widgets/glances/glances.jsx | 30 +++++++--------- src/components/widgets/greeting/greeting.jsx | 7 +++- .../widgets/kubernetes/kubernetes.jsx | 29 +++++++--------- src/components/widgets/logo/logo.jsx | 7 +++- src/components/widgets/longhorn/longhorn.jsx | 25 +++++++------- .../widgets/openmeteo/openmeteo.jsx | 34 +++++++++---------- .../widgets/openweathermap/weather.jsx | 33 +++++++++--------- .../widgets/resources/resources.jsx | 7 +++- src/components/widgets/search/search.jsx | 11 +++--- .../widgets/unifi_console/unifi_console.jsx | 26 +++++++------- src/components/widgets/weather/weather.jsx | 33 +++++++++--------- src/pages/api/widgets/longhorn.js | 2 +- 14 files changed, 153 insertions(+), 122 deletions(-) create mode 100644 src/components/widgets/error.jsx diff --git a/src/components/widgets/datetime/datetime.jsx b/src/components/widgets/datetime/datetime.jsx index 86983473..fc883ec3 100644 --- a/src/components/widgets/datetime/datetime.jsx +++ b/src/components/widgets/datetime/datetime.jsx @@ -1,5 +1,6 @@ import { useState, useEffect } from "react"; import { useTranslation } from "next-i18next"; +import classNames from "classnames"; const textSizes = { "4xl": "text-4xl", @@ -17,7 +18,7 @@ export default function DateTime({ options }) { const { i18n } = useTranslation(); const [date, setDate] = useState(""); const dateLocale = locale ?? i18n.language; - + useEffect(() => { const dateFormat = new Intl.DateTimeFormat(dateLocale, { ...format }); const interval = setInterval(() => { @@ -27,7 +28,10 @@ export default function DateTime({ options }) { }, [date, setDate, dateLocale, format]); return ( -
+
{date} diff --git a/src/components/widgets/error.jsx b/src/components/widgets/error.jsx new file mode 100644 index 00000000..92e0076a --- /dev/null +++ b/src/components/widgets/error.jsx @@ -0,0 +1,23 @@ +import { useTranslation } from "react-i18next"; +import { BiError } from "react-icons/bi"; +import classNames from "classnames"; + +export default function Error({ options }) { + const { t } = useTranslation(); + + return ( +
+
+
+ +
+ {t("widget.api_error")} +
+
+
+
+ ); +} diff --git a/src/components/widgets/glances/glances.jsx b/src/components/widgets/glances/glances.jsx index 85dd44c0..b6daba7b 100644 --- a/src/components/widgets/glances/glances.jsx +++ b/src/components/widgets/glances/glances.jsx @@ -1,11 +1,12 @@ import useSWR from "swr"; import { useContext } from "react"; -import { BiError } from "react-icons/bi"; import { FaMemory, FaRegClock, FaThermometerHalf } from "react-icons/fa"; import { FiCpu, FiHardDrive } from "react-icons/fi"; import { useTranslation } from "next-i18next"; +import classNames from "classnames"; import UsageBar from "../resources/usage-bar"; +import Error from "../error"; import { SettingsContext } from "utils/contexts/settings"; @@ -26,23 +27,15 @@ export default function Widget({ options }) { ); if (error || data?.error) { - return ( -
-
-
- -
- {t("widget.api_error")} -
-
-
-
- ); + return } if (!data) { return ( -
+
@@ -101,7 +94,10 @@ export default function Widget({ options }) { } return ( - +
@@ -184,7 +180,7 @@ export default function Widget({ options }) {
- {t("common.number", { + {t("common.number", { value: mainTemp, maximumFractionDigits: 1, style: "unit", @@ -196,7 +192,7 @@ export default function Widget({ options }) { {options.expanded && (
- {t("common.number", { + {t("common.number", { value: maxTemp, maximumFractionDigits: 1, style: "unit", diff --git a/src/components/widgets/greeting/greeting.jsx b/src/components/widgets/greeting/greeting.jsx index da0f063d..2e129560 100644 --- a/src/components/widgets/greeting/greeting.jsx +++ b/src/components/widgets/greeting/greeting.jsx @@ -1,3 +1,5 @@ +import classNames from "classnames"; + const textSizes = { "4xl": "text-4xl", "3xl": "text-3xl", @@ -12,7 +14,10 @@ const textSizes = { export default function Greeting({ options }) { if (options.text) { return ( -
+
{options.text} diff --git a/src/components/widgets/kubernetes/kubernetes.jsx b/src/components/widgets/kubernetes/kubernetes.jsx index 78c4caaf..514993da 100644 --- a/src/components/widgets/kubernetes/kubernetes.jsx +++ b/src/components/widgets/kubernetes/kubernetes.jsx @@ -1,12 +1,14 @@ import useSWR from "swr"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import classNames from "classnames"; + +import Error from "../error"; import Node from "./node"; export default function Widget({ options }) { const { cluster, nodes } = options; - const { t, i18n } = useTranslation(); + const { i18n } = useTranslation(); const defaultData = { cpu: { @@ -29,23 +31,15 @@ export default function Widget({ options }) { ); if (error || data?.error) { - return ( -
-
-
- -
- {t("widget.api_error")} -
-
-
-
- ); + return } if (!data) { return ( -
+
{cluster.show && @@ -59,7 +53,10 @@ export default function Widget({ options }) { } return ( -
+
{cluster.show && diff --git a/src/components/widgets/logo/logo.jsx b/src/components/widgets/logo/logo.jsx index 96e8569f..6cba17bf 100644 --- a/src/components/widgets/logo/logo.jsx +++ b/src/components/widgets/logo/logo.jsx @@ -1,8 +1,13 @@ +import classNames from "classnames"; + import ResolvedIcon from "components/resolvedicon" export default function Logo({ options }) { return ( -
+
{options.icon ? : // fallback to homepage logo diff --git a/src/components/widgets/longhorn/longhorn.jsx b/src/components/widgets/longhorn/longhorn.jsx index 9fcb21b4..5139f00a 100644 --- a/src/components/widgets/longhorn/longhorn.jsx +++ b/src/components/widgets/longhorn/longhorn.jsx @@ -1,37 +1,36 @@ import useSWR from "swr"; -import { BiError } from "react-icons/bi"; -import { useTranslation } from "next-i18next"; +import classNames from "classnames"; + +import Error from "../error"; import Node from "./node"; export default function Longhorn({ options }) { const { expanded, total, labels, include, nodes } = options; - const { t } = useTranslation(); const { data, error } = useSWR(`/api/widgets/longhorn`, { refreshInterval: 1500 }); if (error || data?.error) { - return ( -
- -
- {t("widget.api_error")} -
-
- ); + return } if (!data) { return ( -
+
); } return ( -
+
{data.nodes .filter((node) => { diff --git a/src/components/widgets/openmeteo/openmeteo.jsx b/src/components/widgets/openmeteo/openmeteo.jsx index 0d29aef5..1381cc55 100644 --- a/src/components/widgets/openmeteo/openmeteo.jsx +++ b/src/components/widgets/openmeteo/openmeteo.jsx @@ -1,9 +1,11 @@ import useSWR from "swr"; import { useState } from "react"; -import { BiError } from "react-icons/bi"; import { WiCloudDown } from "react-icons/wi"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { useTranslation } from "next-i18next"; +import classNames from "classnames"; + +import Error from "../error"; import Icon from "./icon"; @@ -15,24 +17,15 @@ function Widget({ options }) { ); if (error || data?.error) { - return ( -
-
-
- -
- {t("widget.api_error")} - - -
-
-
-
- ); + return } if (!data) { return ( -
+
@@ -50,7 +43,10 @@ function Widget({ options }) { const timeOfDay = data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night"; return ( -
+
@@ -107,8 +103,10 @@ export default function OpenMeteo({ options }) { - ); + return + {t("weather.current")} + {t("weather.allow")} + + ; } return ; diff --git a/src/components/widgets/openweathermap/weather.jsx b/src/components/widgets/openweathermap/weather.jsx index b404039f..30531513 100644 --- a/src/components/widgets/openweathermap/weather.jsx +++ b/src/components/widgets/openweathermap/weather.jsx @@ -3,12 +3,17 @@ import { useState } from "react"; import { WiCloudDown } from "react-icons/wi"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { useTranslation } from "next-i18next"; -import classNames from "classnames"; -import Error from "../error"; +import Error from "../widget/error"; +import Container from "../widget/container"; +import ContainerButton from "../widget/container_button"; +import PrimaryText from "../widget/primary_text"; +import SecondaryText from "../widget/secondary_text"; +import WidgetIcon from "../widget/widget_icon"; import Icon from "./icon"; + function Widget({ options }) { const { t, i18n } = useTranslation(); @@ -21,48 +26,26 @@ function Widget({ options }) { } if (!data) { - return ( -
-
-
- -
-
- {t("weather.updating")} - {t("weather.wait")} -
-
-
- ); + return + {t("weather.updating")} + {t("weather.wait")} + + ; } const unit = options.units === "metric" ? "celsius" : "fahrenheit"; - return ( -
-
-
- data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night"} - /> -
-
- - {options.label && `${options.label}, `} - {t("common.number", { value: data.main.temp, style: "unit", unit })} - - {data.weather[0].description} -
-
-
- ); + const weatherInfo = { + condition: data.weather[0].id, + timeOfDay: data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night" + }; + + return + {options.label && `${options.label}, `} + {t("common.number", { value: data.main.temp, style: "unit", unit })} + {data.weather[0].description} + + ; } export default function OpenWeatherMap({ options }) { @@ -94,33 +77,12 @@ export default function OpenWeatherMap({ options }) { } }; - // if (!requesting && !location) requestLocation(); - if (!location) { - return ( - - ); + return + {t("weather.current")} + {t("weather.allow")} + + ; } return ; diff --git a/src/components/widgets/resources/cpu.jsx b/src/components/widgets/resources/cpu.jsx index 7069e3c4..242e7a3d 100644 --- a/src/components/widgets/resources/cpu.jsx +++ b/src/components/widgets/resources/cpu.jsx @@ -1,8 +1,13 @@ import useSWR from "swr"; import { FiCpu } from "react-icons/fi"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import SingleResource from "../widget/single_resource"; +import WidgetIcon from "../widget/widget_icon"; +import ResourceValue from "../widget/resource_value"; +import ResourceLabel from "../widget/resource_label"; +import Error from "../widget/error"; + import UsageBar from "./usage-bar"; export default function Cpu({ expanded }) { @@ -13,67 +18,38 @@ export default function Cpu({ expanded }) { }); if (error || data?.error) { - return ( -
- -
- {t("widget.api_error")} -
-
- ); + return } if (!data) { - return ( -
- -
-
-
-
-
{t("resources.cpu")}
-
- {expanded && ( -
-
-
-
{t("resources.load")}
-
- )} - -
-
- ); + return + + - + {t("resources.cpu")} + - + {t("resources.load")} + + } - const percent = data.cpu.usage; - - return ( -
- -
-
-
- {t("common.number", { - value: data.cpu.usage, - style: "unit", - unit: "percent", - maximumFractionDigits: 0, - })} -
-
{t("resources.cpu")}
-
- {expanded && ( -
-
- {t("common.number", { - value: data.cpu.load, - maximumFractionDigits: 2, - })} -
-
{t("resources.load")}
-
- )} - -
-
- ); + return + + + {t("common.number", { + value: data.cpu.usage, + style: "unit", + unit: "percent", + maximumFractionDigits: 0, + })} + + {t("resources.cpu")} + + {t("common.number", { + value: data.cpu.load, + maximumFractionDigits: 2, + })} + + {t("resources.load")} + + } diff --git a/src/components/widgets/resources/cputemp.jsx b/src/components/widgets/resources/cputemp.jsx index 571e6c8a..1a62aa31 100644 --- a/src/components/widgets/resources/cputemp.jsx +++ b/src/components/widgets/resources/cputemp.jsx @@ -1,8 +1,13 @@ import useSWR from "swr"; import { FaThermometerHalf } from "react-icons/fa"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import SingleResource from "../widget/single_resource"; +import WidgetIcon from "../widget/widget_icon"; +import ResourceValue from "../widget/resource_value"; +import ResourceLabel from "../widget/resource_label"; +import Error from "../widget/error"; + import UsageBar from "./usage-bar"; function convertToFahrenheit(t) { @@ -17,34 +22,17 @@ export default function CpuTemp({ expanded, units }) { }); if (error || data?.error) { - return ( -
- -
- {t("widget.api_error")} -
-
- ); + return } if (!data || !data.cputemp) { - return ( -
- -
- -
-
-
{t("resources.temp")}
-
- {expanded && ( - -
-
-
{t("resources.max")}
-
- )} -
-
- ); + return + + - + {t("resources.temp")} + - + {t("resources.max")} + } let mainTemp = data.cputemp.main; @@ -54,38 +42,27 @@ export default function CpuTemp({ expanded, units }) { const unit = units === "imperial" ? "fahrenheit" : "celsius"; mainTemp = (unit === "celsius") ? mainTemp : convertToFahrenheit(mainTemp); const maxTemp = (unit === "celsius") ? data.cputemp.max : convertToFahrenheit(data.cputemp.max); - const percent = Math.round((mainTemp / maxTemp) * 100); - return ( -
- -
- -
- {t("common.number", { - value: mainTemp, - maximumFractionDigits: 1, - style: "unit", - unit - })} -
-
{t("resources.temp")}
-
- {expanded && ( - -
- {t("common.number", { - value: maxTemp, - maximumFractionDigits: 1, - style: "unit", - unit - })} -
-
{t("resources.max")}
-
- )} - -
-
- ); + return + + + {t("common.number", { + value: mainTemp, + maximumFractionDigits: 1, + style: "unit", + unit + })} + + {t("resources.temp")} + + {t("common.number", { + value: maxTemp, + maximumFractionDigits: 1, + style: "unit", + unit + })} + + {t("resources.max")} + + ; } diff --git a/src/components/widgets/resources/disk.jsx b/src/components/widgets/resources/disk.jsx index ca09c095..742ff9d7 100644 --- a/src/components/widgets/resources/disk.jsx +++ b/src/components/widgets/resources/disk.jsx @@ -1,8 +1,13 @@ import useSWR from "swr"; import { FiHardDrive } from "react-icons/fi"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import SingleResource from "../widget/single_resource"; +import WidgetIcon from "../widget/widget_icon"; +import ResourceValue from "../widget/resource_value"; +import ResourceLabel from "../widget/resource_label"; +import Error from "../widget/error"; + import UsageBar from "./usage-bar"; export default function Disk({ options, expanded }) { @@ -13,56 +18,29 @@ export default function Disk({ options, expanded }) { }); if (error || data?.error) { - return ( -
- -
- {t("widget.api_error")} -
-
- ); + return } if (!data) { - return ( -
- -
- -
-
-
{t("resources.free")}
-
- {expanded && ( - -
-
-
{t("resources.total")}
-
- )} - -
-
- ); + return + + - + {t("resources.free")} + - + {t("resources.total")} + + ; } // data.drive.used not accurate? const percent = Math.round(((data.drive.size - data.drive.available) / data.drive.size) * 100); - return ( -
- -
- -
{t("common.bytes", { value: data.drive.available })}
-
{t("resources.free")}
-
- {expanded && ( - -
{t("common.bytes", { value: data.drive.size })}
-
{t("resources.total")}
-
- )} - -
-
- ); + return + + {t("common.bytes", { value: data.drive.available })} + {t("resources.free")} + {t("common.bytes", { value: data.drive.size })} + {t("resources.total")} + + ; } diff --git a/src/components/widgets/resources/memory.jsx b/src/components/widgets/resources/memory.jsx index 30b7c8eb..97c74acc 100644 --- a/src/components/widgets/resources/memory.jsx +++ b/src/components/widgets/resources/memory.jsx @@ -1,8 +1,13 @@ import useSWR from "swr"; import { FaMemory } from "react-icons/fa"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import SingleResource from "../widget/single_resource"; +import WidgetIcon from "../widget/widget_icon"; +import ResourceValue from "../widget/resource_value"; +import ResourceLabel from "../widget/resource_label"; +import Error from "../widget/error"; + import UsageBar from "./usage-bar"; export default function Memory({ expanded }) { @@ -13,63 +18,34 @@ export default function Memory({ expanded }) { }); if (error || data?.error) { - return ( -
- -
- {t("widget.api_error")} -
-
- ); + return } if (!data) { - return ( -
- -
- -
-
-
{t("resources.free")}
-
- {expanded && ( - -
-
-
{t("resources.total")}
-
- )} - -
-
- ); + return + + - + {t("resources.free")} + - + {t("resources.total")} + + ; } const percent = Math.round((data.memory.active / data.memory.total) * 100); - return ( -
- -
- -
- {t("common.bytes", { value: data.memory.available, maximumFractionDigits: 1, binary: true })} -
-
{t("resources.free")}
-
- {expanded && ( - -
- {t("common.bytes", { - value: data.memory.total, - maximumFractionDigits: 1, - binary: true, - })} -
-
{t("resources.total")}
-
- )} - -
-
- ); + return + + {t("common.bytes", { value: data.memory.available, maximumFractionDigits: 1, binary: true })} + {t("resources.free")} + + {t("common.bytes", { + value: data.memory.total, + maximumFractionDigits: 1, + binary: true, + })} + + {t("resources.total")} + + ; } diff --git a/src/components/widgets/resources/resources.jsx b/src/components/widgets/resources/resources.jsx index 5727a2a0..0cc2c301 100644 --- a/src/components/widgets/resources/resources.jsx +++ b/src/components/widgets/resources/resources.jsx @@ -1,4 +1,5 @@ -import classNames from "classnames"; +import Container from "../widget/container"; +import Raw from "../widget/raw"; import Disk from "./disk"; import Cpu from "./cpu"; @@ -8,11 +9,8 @@ import Uptime from "./uptime"; export default function Resources({ options }) { const { expanded, units } = options; - return ( -
+ return +
{options.cpu && } {options.memory && } @@ -25,6 +23,6 @@ export default function Resources({ options }) { {options.label && (
{options.label}
)} -
- ); +
+
; } diff --git a/src/components/widgets/resources/uptime.jsx b/src/components/widgets/resources/uptime.jsx index 3bf785b1..6cc2b8c5 100644 --- a/src/components/widgets/resources/uptime.jsx +++ b/src/components/widgets/resources/uptime.jsx @@ -1,8 +1,13 @@ import useSWR from "swr"; import { FaRegClock } from "react-icons/fa"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import SingleResource from "../widget/single_resource"; +import WidgetIcon from "../widget/widget_icon"; +import ResourceValue from "../widget/resource_value"; +import ResourceLabel from "../widget/resource_label"; +import Error from "../widget/error"; + import UsageBar from "./usage-bar"; export default function Uptime() { @@ -13,35 +18,22 @@ export default function Uptime() { }); if (error || data?.error) { - return ( -
- -
- {t("widget.api_error")} -
-
- ); + return } if (!data) { - return ( -
- -
- -
-
-
{t("resources.temp")}
-
-
-
- ); + return + + - + {t("resources.uptime")} + ; } const mo = Math.floor(data.uptime / (3600 * 24 * 31)); const d = Math.floor(data.uptime % (3600 * 24 * 31) / (3600 * 24)); const h = Math.floor(data.uptime % (3600 * 24) / 3600); const m = Math.floor(data.uptime % 3600 / 60); - + let uptime; if (mo > 0) uptime = `${mo}${t("resources.months")} ${d}${t("resources.days")}`; else if (d > 0) uptime = `${d}${t("resources.days")} ${h}${t("resources.hours")}`; @@ -49,18 +41,10 @@ export default function Uptime() { const percent = Math.round((new Date().getSeconds() / 60) * 100); - return ( -
- -
- -
- {uptime} -
-
{t("resources.uptime")}
-
- -
-
- ); + return + + {uptime} + {t("resources.uptime")} + + ; } diff --git a/src/components/widgets/search/search.jsx b/src/components/widgets/search/search.jsx index bca3eb58..1bac4a61 100644 --- a/src/components/widgets/search/search.jsx +++ b/src/components/widgets/search/search.jsx @@ -1,10 +1,13 @@ -import { useState, useEffect, Fragment } from "react"; +import { useState, useEffect, useCallback, Fragment } from "react"; import { useTranslation } from "next-i18next"; import { FiSearch } from "react-icons/fi"; import { SiDuckduckgo, SiMicrosoftbing, SiGoogle, SiBaidu, SiBrave } from "react-icons/si"; import { Listbox, Transition } from "@headlessui/react"; import classNames from "classnames"; +import ContainerForm from "../widget/container_form"; +import Raw from "../widget/raw"; + export const searchProviders = { google: { name: "Google", @@ -77,13 +80,8 @@ export default function Search({ options }) { } }, [availableProviderIds]); - if (!availableProviderIds) { - return null; - } - - function handleSubmit(event) { + const submitCallback = useCallback(event => { const q = encodeURIComponent(query); - const { url } = selectedProvider; if (url) { window.open(`${url}${q}`, options.target || "_blank"); @@ -94,6 +92,10 @@ export default function Search({ options }) { event.preventDefault(); event.target.reset(); setQuery(""); + }, [options.target, options.url, query, selectedProvider]); + + if (!availableProviderIds) { + return null; } const onChangeProvider = (provider) => { @@ -101,80 +103,79 @@ export default function Search({ options }) { localStorage.setItem(localStorageKey, provider.name); } - return ( - -
- setQuery(s.currentTarget.value)} - required - autoCapitalize="off" - autoCorrect="off" - autoComplete="off" - // eslint-disable-next-line jsx-a11y/no-autofocus - autoFocus={options.focus} - /> - -
- + +
+
+ setQuery(s.currentTarget.value)} + required + autoCapitalize="off" + autoCorrect="off" + autoComplete="off" + // eslint-disable-next-line jsx-a11y/no-autofocus + autoFocus={options.focus} + /> + +
+ + + {t("search.search")} + +
+ - - {t("search.search")} - -
- - -
- {availableProviderIds.map((providerId) => { - const p = searchProviders[providerId]; - return ( - - {({ active }) => ( -
  • - -
  • - )} -
    - ); - })} -
    -
    -
    - - - ); + +
    + {availableProviderIds.map((providerId) => { + const p = searchProviders[providerId]; + return ( + + {({ active }) => ( +
  • + +
  • + )} +
    + ); + })} +
    +
    + + +
    +
    + ; } diff --git a/src/components/widgets/unifi_console/unifi_console.jsx b/src/components/widgets/unifi_console/unifi_console.jsx index 1896771f..dad92cc7 100644 --- a/src/components/widgets/unifi_console/unifi_console.jsx +++ b/src/components/widgets/unifi_console/unifi_console.jsx @@ -2,9 +2,12 @@ import { BiError, BiWifi, BiCheckCircle, BiXCircle, BiNetworkChart } from "react import { MdSettingsEthernet } from "react-icons/md"; import { useTranslation } from "next-i18next"; import { SiUbiquiti } from "react-icons/si"; -import classNames from "classnames"; -import Error from "../error"; +import Error from "../widget/error"; +import Container from "../widget/container"; +import Raw from "../widget/raw"; +import WidgetIcon from "../widget/widget_icon"; +import PrimaryText from "../widget/primary_text"; import useWidgetAPI from "utils/proxy/use-widget-api"; @@ -22,21 +25,10 @@ export default function Widget({ options }) { const defaultSite = options.site ? statsData?.data.find(s => s.desc === options.site) : statsData?.data?.find(s => s.name === "default"); if (!defaultSite) { - return ( -
    -
    -
    - -
    -
    - {t("unifi.wait")} -
    -
    -
    - ); + return + {t("unifi.wait")} + + ; } const wan = defaultSite.health.find(h => h.subsystem === "wan"); @@ -51,11 +43,9 @@ export default function Widget({ options }) { const dataEmpty = !(wan.show || lan.show || wlan.show || uptime); - return ( -
    + return + +
    @@ -139,6 +129,7 @@ export default function Widget({ options }) {
    }
    -
    - ); +
    + + } diff --git a/src/components/widgets/weather/weather.jsx b/src/components/widgets/weather/weather.jsx index 51801455..702ea669 100644 --- a/src/components/widgets/weather/weather.jsx +++ b/src/components/widgets/weather/weather.jsx @@ -3,9 +3,13 @@ import { useState } from "react"; import { WiCloudDown } from "react-icons/wi"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { useTranslation } from "next-i18next"; -import classNames from "classnames"; -import Error from "../error"; +import Error from "../widget/error"; +import Container from "../widget/container"; +import PrimaryText from "../widget/primary_text"; +import SecondaryText from "../widget/secondary_text"; +import WidgetIcon from "../widget/widget_icon"; +import ContainerButton from "../widget/container_button"; import Icon from "./icon"; @@ -21,49 +25,31 @@ function Widget({ options }) { } if (!data) { - return ( -
    -
    -
    - -
    -
    - {t("weather.updating")} - {t("weather.wait")} -
    -
    -
    - ); + return + {t("weather.updating")} + {t("weather.wait")} + + ; } const unit = options.units === "metric" ? "celsius" : "fahrenheit"; + const weatherInfo = { + condition: data.current.condition.code, + timeOfDay: data.current.is_day ? "day" : "night", + }; - return ( -
    -
    -
    - -
    -
    - - {options.label && `${options.label}, `} - {t("common.number", { - value: options.units === "metric" ? data.current.temp_c : data.current.temp_f, - style: "unit", - unit, - })} - - {data.current.condition.text} -
    -
    -
    - ); + return + + {options.label && `${options.label}, `} + {t("common.number", { + value: options.units === "metric" ? data.current.temp_c : data.current.temp_f, + style: "unit", + unit, + })} + + {data.current.condition.text} + + ; } export default function WeatherApi({ options }) { @@ -95,33 +81,12 @@ export default function WeatherApi({ options }) { } }; - // if (!requesting && !location) requestLocation(); - if (!location) { - return ( - - ); + return + {t("weather.current")} + {t("weather.allow")} + + ; } return ; diff --git a/src/components/widgets/widget.jsx b/src/components/widgets/widget.jsx index 47141887..b4fdb143 100644 --- a/src/components/widgets/widget.jsx +++ b/src/components/widgets/widget.jsx @@ -17,13 +17,13 @@ const widgetMappings = { kubernetes: dynamic(() => import("components/widgets/kubernetes/kubernetes")), }; -export default function Widget({ widget }) { +export default function Widget({ widget, style }) { const InfoWidget = widgetMappings[widget.type]; if (InfoWidget) { return ( - + ); } diff --git a/src/components/widgets/widget/container.jsx b/src/components/widgets/widget/container.jsx new file mode 100644 index 00000000..3a4a9f57 --- /dev/null +++ b/src/components/widgets/widget/container.jsx @@ -0,0 +1,42 @@ +import classNames from "classnames"; + +import WidgetIcon from "./widget_icon"; +import PrimaryText from "./primary_text"; +import SecondaryText from "./secondary_text"; +import Raw from "./raw"; + +export function getAllClasses(options, additionalClassNames = '') { + return classNames( + "flex flex-col justify-center first:ml-0 ml-4 mr-2", + additionalClassNames, + options?.style === "boxedWidgets" && " ml-4 mt-2 m:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-2 pl-3", + ); +} + +export function getInnerBlock(children) { + // children won't be an array if it's Raw component + return Array.isArray(children) &&
    +
    {children.find(child => child.type === WidgetIcon)}
    +
    + {children.find(child => child.type === PrimaryText)} + {children.find(child => child.type === SecondaryText)} +
    +
    ; +} + +export function getBottomBlock(children) { + if (children.type !== Raw) { + return children.find(child => child.type === Raw) || []; + } + + return [children]; +} + +export default function Container({ children = [], options, additionalClassNames = '' }) { + return ( +
    + {getInnerBlock(children)} + {getBottomBlock(children)} +
    + ); +} diff --git a/src/components/widgets/widget/container_button.jsx b/src/components/widgets/widget/container_button.jsx new file mode 100644 index 00000000..92d8a416 --- /dev/null +++ b/src/components/widgets/widget/container_button.jsx @@ -0,0 +1,10 @@ +import { getAllClasses, getInnerBlock, getBottomBlock } from "./container"; + +export default function ContainerButton ({ children = [], options, additionalClassNames = '', callback }) { + return ( + + ); +} diff --git a/src/components/widgets/widget/container_form.jsx b/src/components/widgets/widget/container_form.jsx new file mode 100644 index 00000000..7d28a1bb --- /dev/null +++ b/src/components/widgets/widget/container_form.jsx @@ -0,0 +1,10 @@ +import { getAllClasses, getInnerBlock, getBottomBlock } from "./container"; + +export default function ContainerForm ({ children = [], options, additionalClassNames = '', callback }) { + return ( +
    + {getInnerBlock(children)} + {getBottomBlock(children)} +
    + ); +} diff --git a/src/components/widgets/widget/container_link.jsx b/src/components/widgets/widget/container_link.jsx new file mode 100644 index 00000000..8ef0e80a --- /dev/null +++ b/src/components/widgets/widget/container_link.jsx @@ -0,0 +1,10 @@ +import { getAllClasses, getInnerBlock, getBottomBlock } from "./container"; + +export default function ContainerLink ({ children = [], options, additionalClassNames = '', target }) { + return ( + + {getInnerBlock(children)} + {getBottomBlock(children)} + + ); +} diff --git a/src/components/widgets/widget/error.jsx b/src/components/widgets/widget/error.jsx new file mode 100644 index 00000000..a3dbab85 --- /dev/null +++ b/src/components/widgets/widget/error.jsx @@ -0,0 +1,15 @@ +import { useTranslation } from "react-i18next"; +import { BiError } from "react-icons/bi"; + +import Container from "./container"; +import PrimaryText from "./primary_text"; +import WidgetIcon from "./widget_icon"; + +export default function Error({ options }) { + const { t } = useTranslation(); + + return + {t("widget.api_error")} + + ; +} diff --git a/src/components/widgets/widget/primary_text.jsx b/src/components/widgets/widget/primary_text.jsx new file mode 100644 index 00000000..3418b92c --- /dev/null +++ b/src/components/widgets/widget/primary_text.jsx @@ -0,0 +1,5 @@ +export default function PrimaryText({ children }) { + return ( + {children} + ); +} diff --git a/src/components/widgets/widget/raw.jsx b/src/components/widgets/widget/raw.jsx new file mode 100644 index 00000000..44e3dddc --- /dev/null +++ b/src/components/widgets/widget/raw.jsx @@ -0,0 +1,7 @@ +export default function Raw({ children }) { + if (children.type === Raw) { + return [children]; + } + + return children; +} diff --git a/src/components/widgets/widget/resource_label.jsx b/src/components/widgets/widget/resource_label.jsx new file mode 100644 index 00000000..87f2ad22 --- /dev/null +++ b/src/components/widgets/widget/resource_label.jsx @@ -0,0 +1,5 @@ +export default function ResourceLabel({ children }) { + return ( +
    {children}
    + ); +} diff --git a/src/components/widgets/widget/resource_value.jsx b/src/components/widgets/widget/resource_value.jsx new file mode 100644 index 00000000..8971c748 --- /dev/null +++ b/src/components/widgets/widget/resource_value.jsx @@ -0,0 +1,5 @@ +export default function ResourceValue({ children }) { + return ( +
    {children}
    + ); +} diff --git a/src/components/widgets/widget/resources.jsx b/src/components/widgets/widget/resources.jsx new file mode 100644 index 00000000..0771ec5e --- /dev/null +++ b/src/components/widgets/widget/resources.jsx @@ -0,0 +1,15 @@ +import ContainerLink from "./container_link"; +import SingleResource from "./single_resource"; +import Raw from "./raw"; +import WidgetLabel from "./widget_label"; + +export default function Resources({ options, children, target }) { + return + +
    + {children.filter(child => child && child.type === SingleResource)} +
    + {children.filter(child => child && child.type === WidgetLabel)} +
    +
    ; +} diff --git a/src/components/widgets/widget/secondary_text.jsx b/src/components/widgets/widget/secondary_text.jsx new file mode 100644 index 00000000..363d1bd0 --- /dev/null +++ b/src/components/widgets/widget/secondary_text.jsx @@ -0,0 +1,5 @@ +export default function SecondaryText({ children }) { + return ( + {children} + ); +} diff --git a/src/components/widgets/widget/single_resource.jsx b/src/components/widgets/widget/single_resource.jsx new file mode 100644 index 00000000..7a83d8be --- /dev/null +++ b/src/components/widgets/widget/single_resource.jsx @@ -0,0 +1,28 @@ +import UsageBar from "../resources/usage-bar"; + +import WidgetIcon from "./widget_icon"; +import ResourceValue from "./resource_value"; +import ResourceLabel from "./resource_label"; +import Raw from "./raw"; + +export default function SingleResource({ children, key, expanded = false }) { + const values = children.filter(child => child.type === ResourceValue); + const labels = children.filter(child => child.type === ResourceLabel); + + return
    + {children.find(child => child.type === WidgetIcon)} +
    +
    + {values.pop()} + {labels.pop()} +
    + { expanded &&
    + {values.pop()} + {labels.pop()} +
    + } + {children.find(child => child.type === UsageBar)} +
    + {children.find(child => child.type === Raw)} +
    ; +} diff --git a/src/components/widgets/widget/widget_icon.jsx b/src/components/widgets/widget/widget_icon.jsx new file mode 100644 index 00000000..9766a879 --- /dev/null +++ b/src/components/widgets/widget/widget_icon.jsx @@ -0,0 +1,18 @@ +export default function WidgetIcon({ icon, size = "s", pulse = false, weatherInfo = {} }) { + const Icon = icon; + const { condition, timeOfDay } = weatherInfo; + let additionalClasses = "text-theme-800 dark:text-theme-200 "; + + switch (size) { + case "m": additionalClasses += "w-6 h-6 "; break; + case "l": additionalClasses += "w-8 h-8 "; break; + case "xl": additionalClasses += "w-10 h-10 "; break; + default: additionalClasses += "w-5 h-5 "; + } + + if (pulse) { + additionalClasses += "animate-pulse "; + } + + return ; +} diff --git a/src/components/widgets/widget/widget_label.jsx b/src/components/widgets/widget/widget_label.jsx new file mode 100644 index 00000000..dcb9b9e9 --- /dev/null +++ b/src/components/widgets/widget/widget_label.jsx @@ -0,0 +1,3 @@ +export default function WidgetLabel({ label = "" }) { + return
    {label}
    +} diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 06e55010..902c79df 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -160,6 +160,7 @@ const headerStyles = { "m-4 mb-0 sm:m-8 sm:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-3", underlined: "m-4 mb-0 sm:m-8 sm:mb-1 border-b-2 pb-4 border-theme-800 dark:border-theme-200/50", clean: "m-4 mb-0 sm:m-8 sm:mb-0", + boxedWidgets: "m-4 mb-0 sm:m-8 sm:mb-0 sm:mt-1", }; function Home({ initialSettings }) { @@ -208,6 +209,7 @@ function Home({ initialSettings }) { searchProvider = searchProviders[searchWidget.options?.provider]; } } + const headerStyle = initialSettings?.headerStyle || "underlined"; useEffect(() => { function handleKeyDown(e) { @@ -256,7 +258,7 @@ function Home({ initialSettings }) {
    !rightAlignedWidgets.includes(widget.type)) .map((widget, i) => ( - + ))} -
    +
    {widgets .filter((widget) => rightAlignedWidgets.includes(widget.type)) .map((widget, i) => ( - + ))}
    From 7e54b80d73547d6cd338c5ced05f763df0986a5c Mon Sep 17 00:00:00 2001 From: Nonoss117 Date: Sat, 3 Jun 2023 15:29:24 +0000 Subject: [PATCH 006/207] Translated using Weblate (French) Currently translated at 100.0% (461 of 461 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/ --- public/locales/fr/common.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 2e9e0e0d..a85eb438 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -397,7 +397,7 @@ "queue": "À traiter", "processed": "Traité", "errored": "En erreur", - "saved": "Economisé" + "saved": "Gagné" }, "miniflux": { "read": "Lu", From f05ac3247d438b19ea0d53cc99018332339c1fb5 Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Fri, 2 Jun 2023 21:49:58 +0000 Subject: [PATCH 007/207] Translated using Weblate (Croatian) Currently translated at 99.5% (459 of 461 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/ --- public/locales/hr/common.json | 50 +++++++++++++++++------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json index db20a999..268a1f89 100644 --- a/public/locales/hr/common.json +++ b/public/locales/hr/common.json @@ -239,11 +239,11 @@ "uptime": "UP", "days": "d", "hours": "h", - "used": "Used", - "load": "Load", - "warn": "Warn", - "total": "Total", - "free": "Free" + "used": "Korišteno", + "load": "Opterećenje", + "warn": "Upozori", + "total": "Ukupno", + "free": "Slobodno" }, "changedetectionio": { "totalObserved": "Ukupno promatrano", @@ -478,7 +478,7 @@ "up": "Aktivne stranice", "down": "Neaktivne stranice", "uptime": "Radno vrijeme", - "incident": "Incident", + "incident": "Slučaj", "m": "min" }, "komga": { @@ -609,36 +609,36 @@ "poolUsage": "Korištenje memorijskog skupa", "cpuUsage": "Korištenje procesora", "memUsage": "Korištenje memorije", - "volumeUsage": "Volume Usage", - "invalid": "Invalid" + "volumeUsage": "Korištenje jedinice memorije", + "invalid": "Neispravno" }, "pfsense": { - "load": "Load Avg", - "memory": "Mem Usage", - "wanStatus": "WAN Status", + "load": "Prosječno opterećenje", + "memory": "Korištenje memorije", + "wanStatus": "Stanje WAN-a", "up": "Up", "down": "Down", - "temp": "Temp", - "disk": "Disk Usage", + "temp": "Temperatura", + "disk": "Korištenje diska", "wanIP": "WAN IP" }, "caddy": { - "upstreams": "Upstreams", - "requests": "Current requests", - "requests_failed": "Failed requests" + "upstreams": "Glavne grane", + "requests": "Aktualni zahtjevi", + "requests_failed": "Neuspjeli zahtjevi" }, "evcc": { - "pv_power": "Production", - "battery_soc": "Battery", - "grid_power": "Grid", - "home_power": "Consumption", - "charge_power": "Charger", + "pv_power": "Proizvodnja", + "battery_soc": "Baterija", + "grid_power": "Raspored", + "home_power": "Potrošnja", + "charge_power": "Punjač", "watt_hour": "Wh" }, "pialert": { - "total": "Total", - "connected": "Connected", - "new_devices": "New Devices", - "down_alerts": "Down Alerts" + "total": "Ukupno", + "connected": "Povezano", + "new_devices": "Novi uređaji", + "down_alerts": "Obavijest o rušenju" } } From f656c2b46d5940a0ccdadb7bff73f4ba29e7030b Mon Sep 17 00:00:00 2001 From: RoyK Date: Mon, 5 Jun 2023 16:06:14 +0200 Subject: [PATCH 008/207] fix(service-helper): service detection with Docker Swarm The current implementation of service detection focusses on containers. However when using Docker Swarm this limits automatic service detection to the containers running on the same node as homepage (or docker-proxy). Detecting other services in the docker swarm is with the current implementation not possible. This commit fixes this by getting the appropriate labels from services when Docker swarm is configured in the config file. This ensures that the appropriate labels are gathered from the service definition instead of the container definiation, thus allowing for automatic service detection for the entire Docker swarm. Please note that in order for this to function the homepage (or dockerproxy) should be running on a manager node. Only the manager node is able to gather all the relevant service labels. Fixes: #752, #970, #955, #1255, #1045, #1496 --- src/utils/config/service-helpers.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index 7f9d45e4..00c236eb 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -62,11 +62,14 @@ export async function servicesFromDocker() { const serviceServers = await Promise.all( Object.keys(servers).map(async (serverName) => { + const isSwarm = servers[serverName].swarm ?? false; + try { + const listProperties = { all: true }; + const labelProperty = (isSwarm) ? 'Spec.Labels' : 'Labels'; + const nameProperty = (isSwarm) ? 'Spec.Name' : 'Name[0]'; const docker = new Docker(getDockerArguments(serverName).conn); - const containers = await docker.listContainers({ - all: true, - }); + const containers = await ((isSwarm) ? docker.listServices(listProperties) : docker.listContainers(listProperties)); // bad docker connections can result in a object? // in any case, this ensures the result is the expected array @@ -76,17 +79,18 @@ export async function servicesFromDocker() { const discovered = containers.map((container) => { let constructedService = null; + const labels = shvl.get(container, labelProperty); - Object.keys(container.Labels).forEach((label) => { + Object.keys(labels).forEach((label) => { if (label.startsWith("homepage.")) { if (!constructedService) { constructedService = { - container: container.Names[0].replace(/^\//, ""), + container: shvl.get(container, nameProperty).replace(/^\//, ""), server: serverName, type: 'service' }; } - shvl.set(constructedService, label.replace("homepage.", ""), substituteEnvironmentVars(container.Labels[label])); + shvl.set(constructedService, label.replace("homepage.", ""), substituteEnvironmentVars(labels[label])); } }); From 8f0cd7e088bd0ec2a630ebcbb5eab4f790c5188e Mon Sep 17 00:00:00 2001 From: Cyb3rzombie Date: Mon, 5 Jun 2023 16:23:37 +0200 Subject: [PATCH 009/207] Add support for auth token --- src/utils/proxy/handlers/credentialed.js | 6 ++++++ src/widgets/paperlessngx/widget.js | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/utils/proxy/handlers/credentialed.js b/src/utils/proxy/handlers/credentialed.js index 5d4b7e3b..8fa975d0 100644 --- a/src/utils/proxy/handlers/credentialed.js +++ b/src/utils/proxy/handlers/credentialed.js @@ -55,6 +55,12 @@ export default async function credentialedProxyHandler(req, res, map) { } else { headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`; } + } else if (widget.type === "paperlessngx") { + if (widget.key) { + headers.Authorization = `Token ${widget.key}`; + } else { + headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`; + } } else { headers["X-API-Key"] = `${widget.key}`; } diff --git a/src/widgets/paperlessngx/widget.js b/src/widgets/paperlessngx/widget.js index 8af8079d..de37f595 100644 --- a/src/widgets/paperlessngx/widget.js +++ b/src/widgets/paperlessngx/widget.js @@ -1,8 +1,8 @@ -import genericProxyHandler from "utils/proxy/handlers/generic"; +import credentialedProxyHandler from "utils/proxy/handlers/credentialed"; const widget = { api: "{url}/api/{endpoint}", - proxyHandler: genericProxyHandler, + proxyHandler: credentialedProxyHandler, mappings: { "statistics": { From a55fe939cbbc32dc636d2e61127acda30333aa81 Mon Sep 17 00:00:00 2001 From: Denis Papec Date: Mon, 5 Jun 2023 23:18:18 +0100 Subject: [PATCH 010/207] Further improvements to simplify information widgets Signed-off-by: Denis Papec --- src/components/widgets/glances/glances.jsx | 130 ++++++++---------- src/components/widgets/longhorn/node.jsx | 25 ++-- src/components/widgets/resources/cpu.jsx | 54 +++----- src/components/widgets/resources/cputemp.jsx | 63 ++++----- src/components/widgets/resources/disk.jsx | 41 +++--- src/components/widgets/resources/memory.jsx | 47 +++---- src/components/widgets/resources/uptime.jsx | 22 +-- src/components/widgets/widget/resource.jsx | 22 +++ .../widgets/widget/resource_label.jsx | 5 - .../widgets/widget/resource_value.jsx | 5 - src/components/widgets/widget/resources.jsx | 6 +- .../widgets/widget/single_resource.jsx | 28 ---- 12 files changed, 181 insertions(+), 267 deletions(-) create mode 100644 src/components/widgets/widget/resource.jsx delete mode 100644 src/components/widgets/widget/resource_label.jsx delete mode 100644 src/components/widgets/widget/resource_value.jsx delete mode 100644 src/components/widgets/widget/single_resource.jsx diff --git a/src/components/widgets/glances/glances.jsx b/src/components/widgets/glances/glances.jsx index debb09c7..b45dfefe 100644 --- a/src/components/widgets/glances/glances.jsx +++ b/src/components/widgets/glances/glances.jsx @@ -4,12 +4,8 @@ import { FaMemory, FaRegClock, FaThermometerHalf } from "react-icons/fa"; import { FiCpu, FiHardDrive } from "react-icons/fi"; import { useTranslation } from "next-i18next"; -import UsageBar from "../resources/usage-bar"; import Error from "../widget/error"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Resources from "../widget/resources"; import WidgetLabel from "../widget/widget_label"; @@ -37,31 +33,11 @@ export default function Widget({ options }) { if (!data) { return - - - {t("glances.wait")} - - - - - {t("glances.wait")} - - - {options.cputemp && - - - {t("glances.wait")} - - - } - {options.uptime && - - - {t("glances.wait")} - - - } - {options.label && } + + + { options.cputemp && } + { options.uptime && } + { options.label && } ; } @@ -93,77 +69,81 @@ export default function Widget({ options }) { return ( - - - {t("common.number", { + - {t("glances.cpu")} - {t("common.number", { + })} + label={t("glances.cpu")} + expandedValue={t("common.number", { value: data.load.min15, style: "unit", unit: "percent", - maximumFractionDigits: 0, - })} - {t("glances.load")} - - - - - {t("common.bytes", { + maximumFractionDigits: 0 + })} + expandedLabel={t("glances.load")} + percentage={data.cpu.total} + expanded={options.expanded} + /> + - {t("glances.free")} - {t("common.bytes", { + })} + label={t("glances.free")} + expandedValue={t("common.bytes", { value: data.mem.total, maximumFractionDigits: 1, binary: true, - })} - {t("glances.total")} - - + })} + expandedLabel={t("glances.total")} + percentage={data.mem.percent} + expanded={options.expanded} + /> {disks.map((disk) => ( - - - {t("common.bytes", { value: disk.free })} - {t("glances.free")} - {t("common.bytes", { value: disk.size })} - {t("glances.total")} - - + ))} {options.cputemp && mainTemp > 0 && - - - {t("common.number", { + - {t("glances.temp")} - {t("common.number", { + })} + label={t("glances.temp")} + expandedValue={t("common.number", { value: maxTemp, maximumFractionDigits: 1, style: "unit", unit - })} - {t("glances.warn")} - - + })} + expandedLabel={t("glances.warn")} + percentage={tempPercent} + expanded={options.expanded} + /> } {options.uptime && data.uptime && - - - {data.uptime.replace(" days,", t("glances.days")).replace(/:\d\d:\d\d$/g, t("glances.hours"))} - {t("glances.uptime")} - - + } {options.label && } diff --git a/src/components/widgets/longhorn/node.jsx b/src/components/widgets/longhorn/node.jsx index 9983486e..5235698a 100644 --- a/src/components/widgets/longhorn/node.jsx +++ b/src/components/widgets/longhorn/node.jsx @@ -1,23 +1,20 @@ import { useTranslation } from "next-i18next"; import { FaThermometerHalf } from "react-icons/fa"; -import UsageBar from "../resources/usage-bar"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import WidgetLabel from "../widget/widget_label"; export default function Node({ data, expanded, labels }) { const { t } = useTranslation(); - return - - {t("common.bytes", { value: data.node.available })} - {t("resources.free")} - {t("common.bytes", { value: data.node.maximum })} - {t("resources.total")} - - { labels && } - + return { labels && } + } diff --git a/src/components/widgets/resources/cpu.jsx b/src/components/widgets/resources/cpu.jsx index 242e7a3d..12972fe8 100644 --- a/src/components/widgets/resources/cpu.jsx +++ b/src/components/widgets/resources/cpu.jsx @@ -2,14 +2,9 @@ import useSWR from "swr"; import { FiCpu } from "react-icons/fi"; import { useTranslation } from "next-i18next"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Error from "../widget/error"; -import UsageBar from "./usage-bar"; - export default function Cpu({ expanded }) { const { t } = useTranslation(); @@ -22,34 +17,25 @@ export default function Cpu({ expanded }) { } if (!data) { - return - - - - {t("resources.cpu")} - - - {t("resources.load")} - - + return } - return - - - {t("common.number", { - value: data.cpu.usage, - style: "unit", - unit: "percent", - maximumFractionDigits: 0, - })} - - {t("resources.cpu")} - - {t("common.number", { - value: data.cpu.load, - maximumFractionDigits: 2, - })} - - {t("resources.load")} - - + return } diff --git a/src/components/widgets/resources/cputemp.jsx b/src/components/widgets/resources/cputemp.jsx index 1a62aa31..ba6d9b73 100644 --- a/src/components/widgets/resources/cputemp.jsx +++ b/src/components/widgets/resources/cputemp.jsx @@ -2,14 +2,9 @@ import useSWR from "swr"; import { FaThermometerHalf } from "react-icons/fa"; import { useTranslation } from "next-i18next"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Error from "../widget/error"; -import UsageBar from "./usage-bar"; - function convertToFahrenheit(t) { return t * 9/5 + 32 } @@ -26,13 +21,14 @@ export default function CpuTemp({ expanded, units }) { } if (!data || !data.cputemp) { - return - - - - {t("resources.temp")} - - - {t("resources.max")} - + return ; } let mainTemp = data.cputemp.main; @@ -43,26 +39,23 @@ export default function CpuTemp({ expanded, units }) { mainTemp = (unit === "celsius") ? mainTemp : convertToFahrenheit(mainTemp); const maxTemp = (unit === "celsius") ? data.cputemp.max : convertToFahrenheit(data.cputemp.max); - return - - - {t("common.number", { - value: mainTemp, - maximumFractionDigits: 1, - style: "unit", - unit - })} - - {t("resources.temp")} - - {t("common.number", { - value: maxTemp, - maximumFractionDigits: 1, - style: "unit", - unit - })} - - {t("resources.max")} - - ; + return ; } diff --git a/src/components/widgets/resources/disk.jsx b/src/components/widgets/resources/disk.jsx index 742ff9d7..ab56624d 100644 --- a/src/components/widgets/resources/disk.jsx +++ b/src/components/widgets/resources/disk.jsx @@ -2,14 +2,9 @@ import useSWR from "swr"; import { FiHardDrive } from "react-icons/fi"; import { useTranslation } from "next-i18next"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Error from "../widget/error"; -import UsageBar from "./usage-bar"; - export default function Disk({ options, expanded }) { const { t } = useTranslation(); @@ -22,25 +17,27 @@ export default function Disk({ options, expanded }) { } if (!data) { - return - - - - {t("resources.free")} - - - {t("resources.total")} - - ; + return ; } // data.drive.used not accurate? const percent = Math.round(((data.drive.size - data.drive.available) / data.drive.size) * 100); - return - - {t("common.bytes", { value: data.drive.available })} - {t("resources.free")} - {t("common.bytes", { value: data.drive.size })} - {t("resources.total")} - - ; + return ; } diff --git a/src/components/widgets/resources/memory.jsx b/src/components/widgets/resources/memory.jsx index 97c74acc..19ae8687 100644 --- a/src/components/widgets/resources/memory.jsx +++ b/src/components/widgets/resources/memory.jsx @@ -2,14 +2,9 @@ import useSWR from "swr"; import { FaMemory } from "react-icons/fa"; import { useTranslation } from "next-i18next"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Error from "../widget/error"; -import UsageBar from "./usage-bar"; - export default function Memory({ expanded }) { const { t } = useTranslation(); @@ -22,30 +17,26 @@ export default function Memory({ expanded }) { } if (!data) { - return - - - - {t("resources.free")} - - - {t("resources.total")} - - ; + return ; } const percent = Math.round((data.memory.active / data.memory.total) * 100); - return - - {t("common.bytes", { value: data.memory.available, maximumFractionDigits: 1, binary: true })} - {t("resources.free")} - - {t("common.bytes", { - value: data.memory.total, - maximumFractionDigits: 1, - binary: true, - })} - - {t("resources.total")} - - ; + return ; } diff --git a/src/components/widgets/resources/uptime.jsx b/src/components/widgets/resources/uptime.jsx index 6cc2b8c5..3984975f 100644 --- a/src/components/widgets/resources/uptime.jsx +++ b/src/components/widgets/resources/uptime.jsx @@ -2,14 +2,9 @@ import useSWR from "swr"; import { FaRegClock } from "react-icons/fa"; import { useTranslation } from "next-i18next"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Error from "../widget/error"; -import UsageBar from "./usage-bar"; - export default function Uptime() { const { t } = useTranslation(); @@ -22,11 +17,7 @@ export default function Uptime() { } if (!data) { - return - - - - {t("resources.uptime")} - ; + return ; } const mo = Math.floor(data.uptime / (3600 * 24 * 31)); @@ -39,12 +30,7 @@ export default function Uptime() { else if (d > 0) uptime = `${d}${t("resources.days")} ${h}${t("resources.hours")}`; else uptime = `${h}${t("resources.hours")} ${m}${t("resources.minutes")}`; - const percent = Math.round((new Date().getSeconds() / 60) * 100); + const percent = Math.round((new Date().getSeconds() / 60) * 100).toString(); - return - - {uptime} - {t("resources.uptime")} - - ; + return ; } diff --git a/src/components/widgets/widget/resource.jsx b/src/components/widgets/widget/resource.jsx new file mode 100644 index 00000000..e77bcb5a --- /dev/null +++ b/src/components/widgets/widget/resource.jsx @@ -0,0 +1,22 @@ +import UsageBar from "../resources/usage-bar"; + +export default function Resource({ children, icon, value, label, expandedValue, expandedLabel, percentage, key, expanded = false }) { + const Icon = icon; + + return
    + +
    +
    +
    {value}
    +
    {label}
    +
    + { expanded &&
    +
    {expandedValue}
    +
    {expandedLabel}
    +
    + } + { percentage && } + { children } +
    +
    ; +} diff --git a/src/components/widgets/widget/resource_label.jsx b/src/components/widgets/widget/resource_label.jsx deleted file mode 100644 index 87f2ad22..00000000 --- a/src/components/widgets/widget/resource_label.jsx +++ /dev/null @@ -1,5 +0,0 @@ -export default function ResourceLabel({ children }) { - return ( -
    {children}
    - ); -} diff --git a/src/components/widgets/widget/resource_value.jsx b/src/components/widgets/widget/resource_value.jsx deleted file mode 100644 index 8971c748..00000000 --- a/src/components/widgets/widget/resource_value.jsx +++ /dev/null @@ -1,5 +0,0 @@ -export default function ResourceValue({ children }) { - return ( -
    {children}
    - ); -} diff --git a/src/components/widgets/widget/resources.jsx b/src/components/widgets/widget/resources.jsx index 0771ec5e..19fb021d 100644 --- a/src/components/widgets/widget/resources.jsx +++ b/src/components/widgets/widget/resources.jsx @@ -1,5 +1,5 @@ import ContainerLink from "./container_link"; -import SingleResource from "./single_resource"; +import Resource from "./resource"; import Raw from "./raw"; import WidgetLabel from "./widget_label"; @@ -7,9 +7,9 @@ export default function Resources({ options, children, target }) { return
    - {children.filter(child => child && child.type === SingleResource)} + { children.filter(child => child && child.type === Resource) }
    - {children.filter(child => child && child.type === WidgetLabel)} + { children.filter(child => child && child.type === WidgetLabel) }
    ; } diff --git a/src/components/widgets/widget/single_resource.jsx b/src/components/widgets/widget/single_resource.jsx deleted file mode 100644 index 7a83d8be..00000000 --- a/src/components/widgets/widget/single_resource.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import UsageBar from "../resources/usage-bar"; - -import WidgetIcon from "./widget_icon"; -import ResourceValue from "./resource_value"; -import ResourceLabel from "./resource_label"; -import Raw from "./raw"; - -export default function SingleResource({ children, key, expanded = false }) { - const values = children.filter(child => child.type === ResourceValue); - const labels = children.filter(child => child.type === ResourceLabel); - - return
    - {children.find(child => child.type === WidgetIcon)} -
    -
    - {values.pop()} - {labels.pop()} -
    - { expanded &&
    - {values.pop()} - {labels.pop()} -
    - } - {children.find(child => child.type === UsageBar)} -
    - {children.find(child => child.type === Raw)} -
    ; -} From 5b3d1cc6e06ef71d2d9bf8fe4d396c7383c57370 Mon Sep 17 00:00:00 2001 From: Matteo Bossi Date: Tue, 6 Jun 2023 01:14:10 +0200 Subject: [PATCH 011/207] Make styling more consistent and add toggle to opt-in instead of opting out --- public/locales/en/common.json | 6 ++- src/components/widgets/queue/queueEntry.jsx | 28 ++++++++++ src/utils/config/service-helpers.js | 8 ++- src/widgets/radarr/component.jsx | 57 +++++++++------------ src/widgets/radarr/widget.js | 3 +- src/widgets/sonarr/component.jsx | 57 +++++++++------------ src/widgets/sonarr/widget.js | 3 +- 7 files changed, 92 insertions(+), 70 deletions(-) create mode 100644 src/components/widgets/queue/queueEntry.jsx diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 7f1a86de..a3d74aee 100755 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -194,13 +194,15 @@ "sonarr": { "wanted": "Wanted", "queued": "Queued", - "series": "Series" + "series": "Series", + "queue": "Queue" }, "radarr": { "wanted": "Wanted", "missing": "Missing", "queued": "Queued", - "movies": "Movies" + "movies": "Movies", + "queue": "Queue" }, "lidarr": { "wanted": "Wanted", diff --git a/src/components/widgets/queue/queueEntry.jsx b/src/components/widgets/queue/queueEntry.jsx new file mode 100644 index 00000000..0d0625e9 --- /dev/null +++ b/src/components/widgets/queue/queueEntry.jsx @@ -0,0 +1,28 @@ +import {BsFillPlayFill, BsPauseFill} from "react-icons/bs"; + +export default function QueueEntry({ status, title, activity, timeLeft, progress}) { + return ( +
    +
    +
    + {status === "paused" && ( + + )} + {status !== "paused" && ( + + )} +
    +
    +
    {title}
    +
    +
    + {timeLeft ? `${activity} - ${timeLeft}` : activity} +
    +
    + ); +} diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index 7f9d45e4..41fe263a 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -168,7 +168,7 @@ export async function servicesFromKubernetes() { .filter((ingress) => ingress.metadata.annotations && ingress.metadata.annotations[`${ANNOTATION_BASE}/href`]) ingressList.items.push(...traefikServices); } - + if (!ingressList) { return []; } @@ -276,7 +276,8 @@ export function cleanServiceGroups(groups) { wan, // opnsense widget, pfsense widget enableBlocks, // emby/jellyfin enableNowPlaying, - volume, // diskstation widget + volume, // diskstation widget, + enableQueue, // sonarr/radarr } = cleanedService.widget; const fieldsList = typeof fields === 'string' ? JSON.parse(fields) : fields; @@ -312,6 +313,9 @@ export function cleanServiceGroups(groups) { if (enableBlocks !== undefined) cleanedService.widget.enableBlocks = JSON.parse(enableBlocks); if (enableNowPlaying !== undefined) cleanedService.widget.enableNowPlaying = JSON.parse(enableNowPlaying); } + if (["sonarr", "radarr"].includes(type)) { + if (enableQueue !== undefined) cleanedService.widget.enableQueue = JSON.parse(enableQueue); + } if (["diskstation", "qnap"].includes(type)) { if (volume) cleanedService.widget.volume = volume; } diff --git a/src/widgets/radarr/component.jsx b/src/widgets/radarr/component.jsx index 2e58bf9d..0212eaa7 100644 --- a/src/widgets/radarr/component.jsx +++ b/src/widgets/radarr/component.jsx @@ -1,6 +1,7 @@ import { useTranslation } from "next-i18next"; import { useCallback } from 'react'; -import classNames from 'classnames'; + +import QueueEntry from "../../components/widgets/queue/queueEntry"; import Container from "components/services/widget/container"; import Block from "components/services/widget/block"; @@ -32,6 +33,8 @@ export default function Component({ service }) { return ; } + const enableQueue = widget?.enableQueue; + if (!moviesData || !queuedData || !queueDetailsData) { return ( <> @@ -41,9 +44,11 @@ export default function Component({ service }) { - - - + { enableQueue && + + + + } ); } @@ -56,34 +61,22 @@ export default function Component({ service }) { - - - {Array.isArray(queueDetailsData) ? queueDetailsData.map((queueEntry) => ( -
    -
    -
    -
    {moviesData.all.find((entry) => entry.id === queueEntry.movieId)?.title}
    -
    -
    {formatDownloadState(queueEntry.trackedDownloadState)}
    -
    -
    -
    -
    -
    -
    {queueEntry.timeLeft}
    -
    -
    - )) : undefined} - - + { enableQueue && + + + {Array.isArray(queueDetailsData) ? queueDetailsData.map((queueEntry) => ( + entry.id === queueEntry.movieId)?.title} + activity={formatDownloadState(queueEntry.trackedDownloadState)} + key={queueEntry.movieId} + /> + )) : undefined} + + + } ); } diff --git a/src/widgets/radarr/widget.js b/src/widgets/radarr/widget.js index 0f53ab14..8d70192f 100644 --- a/src/widgets/radarr/widget.js +++ b/src/widgets/radarr/widget.js @@ -29,7 +29,8 @@ const widget = { timeLeft: entry.timeleft, size: entry.size, sizeLeft: entry.sizeleft, - movieId: entry.movieId + movieId: entry.movieId, + status: entry.status })).sort((a, b) => { const downloadingA = a.trackedDownloadState === "downloading" const downloadingB = b.trackedDownloadState === "downloading" diff --git a/src/widgets/sonarr/component.jsx b/src/widgets/sonarr/component.jsx index ee548b58..0f87b975 100644 --- a/src/widgets/sonarr/component.jsx +++ b/src/widgets/sonarr/component.jsx @@ -1,7 +1,8 @@ import { useTranslation } from "next-i18next"; -import classNames from 'classnames'; import { useCallback } from 'react'; +import QueueEntry from "../../components/widgets/queue/queueEntry"; + import Container from "components/services/widget/container"; import Block from "components/services/widget/block"; import useWidgetAPI from "utils/proxy/use-widget-api"; @@ -33,6 +34,8 @@ export default function Component({ service }) { return ; } + const enableQueue = widget?.enableQueue; + if (!wantedData || !queuedData || !seriesData || !queueDetailsData) { return ( <> @@ -41,9 +44,11 @@ export default function Component({ service }) { - - - + { enableQueue && + + + + } ); } @@ -55,34 +60,22 @@ export default function Component({ service }) { - - - {Array.isArray(queueDetailsData) ? queueDetailsData.map((queueEntry) => ( -
    -
    -
    -
    {seriesData.find((entry) => entry.id === queueEntry.seriesId).title} • {queueEntry.episodeTitle}
    -
    -
    {formatDownloadState(queueEntry.trackedDownloadState)}
    -
    -
    -
    -
    -
    -
    {queueEntry.timeLeft}
    -
    -
    - )) : undefined} - - + { enableQueue && + + + {Array.isArray(queueDetailsData) ? queueDetailsData.map((queueEntry) => ( + entry.id === queueEntry.seriesId)?.title } • ${ queueEntry.episodeTitle}`} + activity={formatDownloadState(queueEntry.trackedDownloadState)} + key={queueEntry.episodeId} + /> + )) : undefined} + + + } ); } diff --git a/src/widgets/sonarr/widget.js b/src/widgets/sonarr/widget.js index 80afdb99..c0fae806 100644 --- a/src/widgets/sonarr/widget.js +++ b/src/widgets/sonarr/widget.js @@ -35,7 +35,8 @@ const widget = { sizeLeft: entry.sizeleft, seriesId: entry.seriesId, episodeTitle: entry.episode?.title, - episodeId: entry.episodeId + episodeId: entry.episodeId, + status: entry.status })).sort((a, b) => { const downloadingA = a.trackedDownloadState === "downloading" const downloadingB = b.trackedDownloadState === "downloading" From 3a2926225616f4e1fead3fa98d5b5d99cad530e0 Mon Sep 17 00:00:00 2001 From: nsankbeil Date: Mon, 5 Jun 2023 21:43:49 -0400 Subject: [PATCH 012/207] feat: support compressed responses --- src/utils/proxy/http.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/utils/proxy/http.js b/src/utils/proxy/http.js index e022fb46..f869cd0b 100644 --- a/src/utils/proxy/http.js +++ b/src/utils/proxy/http.js @@ -1,5 +1,7 @@ /* eslint-disable prefer-promise-reject-errors */ /* eslint-disable no-param-reassign */ +import { createUnzip } from "node:zlib"; + import { http, https } from "follow-redirects"; import { addCookieToJar, setCookieHeader } from "./cookie-jar"; @@ -28,12 +30,19 @@ function handleRequest(requestor, url, params) { const request = requestor.request(url, params, (response) => { const data = []; + const contentEncoding = response.headers['content-encoding']?.trim().toLowerCase(); - response.on("data", (chunk) => { + let responseContent = response; + if (contentEncoding === 'gzip' || contentEncoding === 'deflate') { + responseContent = createUnzip(); + response.pipe(responseContent); + } + + responseContent.on("data", (chunk) => { data.push(chunk); }); - response.on("end", () => { + responseContent.on("end", () => { addCookieToJar(url, response.headers); resolve([response.statusCode, response.headers["content-type"], Buffer.concat(data), response.headers]); }); From dd4ee443029ce79e6a8ac600ca8debdcbb1fae38 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 5 Jun 2023 22:21:26 -0700 Subject: [PATCH 013/207] Simplify sonarr / radarr queues, better handle some errors --- public/locales/en/common.json | 6 +- src/components/services/widget/block-list.jsx | 31 ---------- src/components/widgets/queue/queueEntry.jsx | 16 +---- src/widgets/radarr/component.jsx | 54 +++++++--------- src/widgets/radarr/widget.js | 2 +- src/widgets/sonarr/component.jsx | 62 +++++++++---------- src/widgets/sonarr/widget.js | 6 +- tailwind.config.js | 3 - 8 files changed, 64 insertions(+), 116 deletions(-) delete mode 100644 src/components/services/widget/block-list.jsx diff --git a/public/locales/en/common.json b/public/locales/en/common.json index a3d74aee..e20e1908 100755 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -195,14 +195,16 @@ "wanted": "Wanted", "queued": "Queued", "series": "Series", - "queue": "Queue" + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Wanted", "missing": "Missing", "queued": "Queued", "movies": "Movies", - "queue": "Queue" + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Wanted", diff --git a/src/components/services/widget/block-list.jsx b/src/components/services/widget/block-list.jsx deleted file mode 100644 index 138576bc..00000000 --- a/src/components/services/widget/block-list.jsx +++ /dev/null @@ -1,31 +0,0 @@ -import { useTranslation } from "next-i18next"; -import { useCallback, useState } from 'react'; -import classNames from "classnames"; - -import ResolvedIcon from '../../resolvedicon'; - - -export default function BlockList({ label, children, childHeight }) { - const { t } = useTranslation(); - const [isOpen, setOpen] = useState(false); - - const changeState = useCallback(() => setOpen(!isOpen), [isOpen, setOpen]); - - return ( -
    - -
    - {children} -
    -
    - ); -} diff --git a/src/components/widgets/queue/queueEntry.jsx b/src/components/widgets/queue/queueEntry.jsx index 0d0625e9..adea45ad 100644 --- a/src/components/widgets/queue/queueEntry.jsx +++ b/src/components/widgets/queue/queueEntry.jsx @@ -1,22 +1,12 @@ -import {BsFillPlayFill, BsPauseFill} from "react-icons/bs"; - -export default function QueueEntry({ status, title, activity, timeLeft, progress}) { +export default function QueueEntry({ title, activity, timeLeft, progress}) { return ( -
    +
    -
    - {status === "paused" && ( - - )} - {status !== "paused" && ( - - )} -
    {title}
    diff --git a/src/widgets/radarr/component.jsx b/src/widgets/radarr/component.jsx index 0212eaa7..6ce2f599 100644 --- a/src/widgets/radarr/component.jsx +++ b/src/widgets/radarr/component.jsx @@ -5,9 +5,12 @@ import QueueEntry from "../../components/widgets/queue/queueEntry"; import Container from "components/services/widget/container"; import Block from "components/services/widget/block"; -import BlockList from "components/services/widget/block-list"; import useWidgetAPI from "utils/proxy/use-widget-api"; +function getProgress(sizeLeft, size) { + return sizeLeft === 0 ? 100 : (1 - sizeLeft / size) * 100 +} + export default function Component({ service }) { const { t } = useTranslation(); const { widget } = service; @@ -16,7 +19,6 @@ export default function Component({ service }) { const { data: queuedData, error: queuedError } = useWidgetAPI(widget, "queue/status"); const { data: queueDetailsData, error: queueDetailsError } = useWidgetAPI(widget, "queue/details"); - // information taken from the Radarr docs: https://radarr.video/docs/api/ const formatDownloadState = useCallback((downloadState) => { switch (downloadState) { case "importPending": @@ -33,26 +35,19 @@ export default function Component({ service }) { return ; } - const enableQueue = widget?.enableQueue; - if (!moviesData || !queuedData || !queueDetailsData) { return ( - <> - - - - - - - { enableQueue && - - - - } - + + + + + + ); } + const enableQueue = widget?.enableQueue && Array.isArray(queueDetailsData) && queueDetailsData.length > 0; + return ( <> @@ -61,21 +56,16 @@ export default function Component({ service }) { - { enableQueue && - - - {Array.isArray(queueDetailsData) ? queueDetailsData.map((queueEntry) => ( - entry.id === queueEntry.movieId)?.title} - activity={formatDownloadState(queueEntry.trackedDownloadState)} - key={queueEntry.movieId} - /> - )) : undefined} - - + {enableQueue && + queueDetailsData.map((queueEntry) => ( + entry.id === queueEntry.movieId)?.title ?? t("radarr.unknown")} + activity={formatDownloadState(queueEntry.trackedDownloadState)} + key={`${queueEntry.movieId}-${queueEntry.sizeLeft}`} + /> + )) } ); diff --git a/src/widgets/radarr/widget.js b/src/widgets/radarr/widget.js index 8d70192f..3373975e 100644 --- a/src/widgets/radarr/widget.js +++ b/src/widgets/radarr/widget.js @@ -29,7 +29,7 @@ const widget = { timeLeft: entry.timeleft, size: entry.size, sizeLeft: entry.sizeleft, - movieId: entry.movieId, + movieId: entry.movieId ?? entry.id, status: entry.status })).sort((a, b) => { const downloadingA = a.trackedDownloadState === "downloading" diff --git a/src/widgets/sonarr/component.jsx b/src/widgets/sonarr/component.jsx index 0f87b975..27b1ab03 100644 --- a/src/widgets/sonarr/component.jsx +++ b/src/widgets/sonarr/component.jsx @@ -6,7 +6,20 @@ import QueueEntry from "../../components/widgets/queue/queueEntry"; import Container from "components/services/widget/container"; import Block from "components/services/widget/block"; import useWidgetAPI from "utils/proxy/use-widget-api"; -import BlockList from 'components/services/widget/block-list'; + +function getProgress(sizeLeft, size) { + return sizeLeft === 0 ? 100 : (1 - sizeLeft / size) * 100 +} + +function getTitle(queueEntry, seriesData) { + let title = '' + const seriesTitle = seriesData.find((entry) => entry.id === queueEntry.seriesId)?.title; + if (seriesTitle) title += `${seriesTitle}: `; + const { episodeTitle } = queueEntry; + if (episodeTitle) title += episodeTitle; + if (title === '') return null; + return title; +} export default function Component({ service }) { const { t } = useTranslation(); @@ -17,7 +30,6 @@ export default function Component({ service }) { const { data: seriesData, error: seriesError } = useWidgetAPI(widget, "series"); const { data: queueDetailsData, error: queueDetailsError } = useWidgetAPI(widget, "queue/details"); - // information taken from the Sonarr docs: https://sonarr.tv/docs/api/ const formatDownloadState = useCallback((downloadState) => { switch (downloadState) { case "importPending": @@ -34,25 +46,18 @@ export default function Component({ service }) { return ; } - const enableQueue = widget?.enableQueue; - if (!wantedData || !queuedData || !seriesData || !queueDetailsData) { return ( - <> - - - - - - { enableQueue && - - - - } - + + + + + ); } + const enableQueue = widget?.enableQueue && Array.isArray(queueDetailsData) && queueDetailsData.length > 0; + return ( <> @@ -60,21 +65,16 @@ export default function Component({ service }) { - { enableQueue && - - - {Array.isArray(queueDetailsData) ? queueDetailsData.map((queueEntry) => ( - entry.id === queueEntry.seriesId)?.title } • ${ queueEntry.episodeTitle}`} - activity={formatDownloadState(queueEntry.trackedDownloadState)} - key={queueEntry.episodeId} - /> - )) : undefined} - - + {enableQueue && + queueDetailsData.map((queueEntry) => ( + + )) } ); diff --git a/src/widgets/sonarr/widget.js b/src/widgets/sonarr/widget.js index c0fae806..7f658eb1 100644 --- a/src/widgets/sonarr/widget.js +++ b/src/widgets/sonarr/widget.js @@ -34,9 +34,9 @@ const widget = { size: entry.size, sizeLeft: entry.sizeleft, seriesId: entry.seriesId, - episodeTitle: entry.episode?.title, - episodeId: entry.episodeId, - status: entry.status + episodeTitle: entry.episode?.title ?? entry.title, + episodeId: entry.episodeId ?? entry.id, + status: entry.status, })).sort((a, b) => { const downloadingA = a.trackedDownloadState === "downloading" const downloadingB = b.trackedDownloadState === "downloading" diff --git a/tailwind.config.js b/tailwind.config.js index 96c9e641..b981051b 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -29,9 +29,6 @@ module.exports = { '3xl': '1800px', // => @media (min-width: 1800px) { ... } }, - transitionProperty: { - 'height': 'height' - }, }, }, plugins: [tailwindForms, tailwindScrollbars], From a05474728520ac33b400b4ef72ae2c92c55db9eb Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:13 +0000 Subject: [PATCH 014/207] Translated using Weblate (German) Currently translated at 98.4% (458 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/ --- public/locales/de/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/de/common.json b/public/locales/de/common.json index b62c5e6a..0d664d99 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -66,13 +66,17 @@ "sonarr": { "wanted": "Gesucht", "queued": "In Warteschlange", - "series": "Serien" + "series": "Serien", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Gesucht", "queued": "In Warteschlange", "movies": "Filme", - "missing": "Fehlt" + "missing": "Fehlt", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "Gesucht", From fd0d644474f5db1883da534e3d46bba29afb977b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:14 +0000 Subject: [PATCH 015/207] Translated using Weblate (Spanish) Currently translated at 99.1% (461 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/ --- public/locales/es/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/es/common.json b/public/locales/es/common.json index 1ca5a62f..5d528e64 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -66,13 +66,17 @@ "sonarr": { "wanted": "Buscando", "queued": "En cola", - "series": "Series" + "series": "Series", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Buscando", "queued": "En cola", "movies": "Películas", - "missing": "Faltan" + "missing": "Faltan", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "Buscando", From 7367bd4a1ff1e5d4fa79036bd6fb53dfbc75bc94 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:14 +0000 Subject: [PATCH 016/207] Translated using Weblate (French) Currently translated at 99.1% (461 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/ --- public/locales/fr/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index a85eb438..12f2098c 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -66,13 +66,17 @@ "sonarr": { "wanted": "Demande", "queued": "Attente", - "series": "Séries" + "series": "Séries", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Demande", "queued": "Attente", "movies": "Films", - "missing": "Manquant" + "missing": "Manquant", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "Demande", From bcdbcb2cb7b9650a2b9564724a2d7ebaaba98a53 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:15 +0000 Subject: [PATCH 017/207] Translated using Weblate (Portuguese) Currently translated at 87.0% (405 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/ --- public/locales/pt/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index b0df5367..ef5f7cd8 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -66,13 +66,17 @@ "sonarr": { "wanted": "Desejada", "queued": "Em fila", - "series": "Séries" + "series": "Séries", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Desejado", "queued": "Fila", "movies": "Filmes", - "missing": "Faltando" + "missing": "Faltando", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "Desejados", From 3061654eeb7e118449e44e64f7ca9402125838b1 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:06 +0000 Subject: [PATCH 018/207] Translated using Weblate (Russian) Currently translated at 89.0% (414 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/ --- public/locales/ru/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index 454bfdfe..5e16f154 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -66,13 +66,17 @@ "sonarr": { "wanted": "Хотел", "queued": "В очереди", - "series": "Серии" + "series": "Серии", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Хотел", "queued": "В очереди", "movies": "Фильмы", - "missing": "Пропущено" + "missing": "Пропущено", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "Хотел", From 4c55eee55bb24f0b6a1641076ac76f91b7267879 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:07 +0000 Subject: [PATCH 019/207] Translated using Weblate (Chinese (Simplified)) Currently translated at 95.4% (444 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/ --- public/locales/zh-CN/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json index 0d6f427e..1b6a7ea2 100644 --- a/public/locales/zh-CN/common.json +++ b/public/locales/zh-CN/common.json @@ -66,13 +66,17 @@ "sonarr": { "wanted": "想看", "queued": "排队", - "series": "系列" + "series": "系列", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "想看", "queued": "队列", "movies": "电影", - "missing": "丢失" + "missing": "丢失", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "订阅", From 86cb124894d7eda1a4a1a2f34b01fb964d085437 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:02 +0000 Subject: [PATCH 020/207] Translated using Weblate (Italian) Currently translated at 61.7% (287 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/ --- public/locales/it/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/it/common.json b/public/locales/it/common.json index 8dc065d4..5eed8b41 100644 --- a/public/locales/it/common.json +++ b/public/locales/it/common.json @@ -81,13 +81,17 @@ "sonarr": { "series": "Serie", "wanted": "Richiesti", - "queued": "In coda" + "queued": "In coda", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Richiesti", "queued": "In coda", "movies": "Film", - "missing": "Mancanti" + "missing": "Mancanti", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "Richiesti", From ece83fd53100125f7169273c01a3ce174ba61abd Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:03 +0000 Subject: [PATCH 021/207] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 16.9% (79 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/ --- public/locales/nb-NO/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json index e7a2dd5c..5761e333 100644 --- a/public/locales/nb-NO/common.json +++ b/public/locales/nb-NO/common.json @@ -66,13 +66,17 @@ "sonarr": { "wanted": "Ønsket", "queued": "I kø", - "series": "Serie" + "series": "Serie", + "unknown": "Unknown", + "queue": "Queue" }, "radarr": { "wanted": "Ønsket", "queued": "I kø", "movies": "Filmer", - "missing": "Missing" + "missing": "Missing", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "Wanted", From 51a1562ea93d565e31d7286cc39763127ad67d9d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:04 +0000 Subject: [PATCH 022/207] Translated using Weblate (Vietnamese) Currently translated at 9.4% (44 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/ --- public/locales/vi/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index 54431b3c..2b551546 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -66,13 +66,17 @@ "sonarr": { "wanted": "Wanted", "queued": "Queued", - "series": "Series" + "series": "Series", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Wanted", "queued": "Queued", "movies": "Phim", - "missing": "Missing" + "missing": "Missing", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "Đang tìm", From 63247f3a9f245f2f6c1509ebeac83cd19db629f5 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:03 +0000 Subject: [PATCH 023/207] Translated using Weblate (Dutch) Currently translated at 52.0% (242 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/ --- public/locales/nl/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json index 0be39980..fad081f6 100644 --- a/public/locales/nl/common.json +++ b/public/locales/nl/common.json @@ -82,13 +82,17 @@ "sonarr": { "wanted": "Gezocht", "queued": "In de wachtrij", - "series": "Series" + "series": "Series", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "movies": "Films", "wanted": "Gezocht", "queued": "In de wachtrij", - "missing": "Missend" + "missing": "Missend", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "Gezocht", From 4cf8302d4f3de317c084a9b8e7b7c49067440847 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:09 +0000 Subject: [PATCH 024/207] Translated using Weblate (Chinese (Traditional)) Currently translated at 99.1% (461 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/ --- public/locales/zh-Hant/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json index 75674709..7ea7c835 100644 --- a/public/locales/zh-Hant/common.json +++ b/public/locales/zh-Hant/common.json @@ -88,12 +88,16 @@ "movies": "電影", "wanted": "關注中", "queued": "已加入佇列", - "missing": "缺少" + "missing": "缺少", + "queue": "Queue", + "unknown": "Unknown" }, "sonarr": { "wanted": "關注中", "queued": "已加入佇列", - "series": "影集" + "series": "影集", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "關注中", From a2204a3de9aa890f624f9d9370cedc211f83ea05 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:05 +0000 Subject: [PATCH 025/207] Translated using Weblate (Catalan) Currently translated at 56.1% (261 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/ --- public/locales/ca/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json index 33fe5338..b133c24f 100644 --- a/public/locales/ca/common.json +++ b/public/locales/ca/common.json @@ -26,7 +26,9 @@ "sonarr": { "wanted": "Volgut", "queued": "En cua", - "series": "Sèries" + "series": "Sèries", + "queue": "Queue", + "unknown": "Unknown" }, "speedtest": { "ping": "Ping", @@ -99,7 +101,9 @@ "wanted": "Volgut", "queued": "En cua", "movies": "Pel·lícules", - "missing": "Faltant" + "missing": "Faltant", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "Volgut", From f66dc86e245332fc2635c0b299bdcdbf550ba28d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:32:59 +0000 Subject: [PATCH 026/207] Translated using Weblate (Polish) Currently translated at 80.6% (375 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/ --- public/locales/pl/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index a900de72..18a57078 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -110,13 +110,17 @@ "sonarr": { "wanted": "Poszukiwane", "queued": "W kolejce", - "series": "Seriale" + "series": "Seriale", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Poszukiwane", "queued": "W kolejce", "movies": "Filmy", - "missing": "Brakujące" + "missing": "Brakujące", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Poszukiwane", From ff7ee3149705e6f5b5189e2e0bbe56f8cfd6652a Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:05 +0000 Subject: [PATCH 027/207] Translated using Weblate (Swedish) Currently translated at 28.1% (131 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/ --- public/locales/sv/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json index 37b38a71..0da6efb3 100644 --- a/public/locales/sv/common.json +++ b/public/locales/sv/common.json @@ -88,13 +88,17 @@ "sonarr": { "wanted": "Eftersöker", "queued": "I kö", - "series": "Serier" + "series": "Serier", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Eftersöker", "queued": "I kö", "movies": "Filmer", - "missing": "Missing" + "missing": "Missing", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Eftersöker", From e2c8b2000f7af5172d6e6ec2f5594edf8fa6306b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:07 +0000 Subject: [PATCH 028/207] Translated using Weblate (Croatian) Currently translated at 98.7% (459 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/ --- public/locales/hr/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json index 268a1f89..fce370ce 100644 --- a/public/locales/hr/common.json +++ b/public/locales/hr/common.json @@ -125,13 +125,17 @@ "sonarr": { "wanted": "Zatraženo", "queued": "U redu čekanja", - "series": "Serije" + "series": "Serije", + "unknown": "Unknown", + "queue": "Queue" }, "radarr": { "wanted": "Zatraženo", "queued": "U redu čekanja", "movies": "Filmovi", - "missing": "Nedostaje" + "missing": "Nedostaje", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Zatraženo", From 4682b5a9a2d6cd6037edc443eaf4ebf4270f738c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:11 +0000 Subject: [PATCH 029/207] Translated using Weblate (Hungarian) Currently translated at 23.2% (108 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/ --- public/locales/hu/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json index b417692d..98687d9f 100644 --- a/public/locales/hu/common.json +++ b/public/locales/hu/common.json @@ -108,13 +108,17 @@ "sonarr": { "wanted": "Keresett", "queued": "Sorban áll", - "series": "Sorozat" + "series": "Sorozat", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Keresett", "queued": "Sorban áll", "movies": "Filmek", - "missing": "Missing" + "missing": "Missing", + "queue": "Queue", + "unknown": "Unknown" }, "ombi": { "pending": "Függőben", From 46b988eeea1fe7b814566c410482bd44ced6c4e6 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:11 +0000 Subject: [PATCH 030/207] Translated using Weblate (Hebrew) Currently translated at 21.7% (101 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/ --- public/locales/he/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/he/common.json b/public/locales/he/common.json index 50f61ae5..9e682c20 100644 --- a/public/locales/he/common.json +++ b/public/locales/he/common.json @@ -94,13 +94,17 @@ "sonarr": { "wanted": "מבוקש", "queued": "בתור", - "series": "סדרות" + "series": "סדרות", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "מבוקש", "queued": "בתור", "movies": "סרטים", - "missing": "Missing" + "missing": "Missing", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "מבוקש", From 26d17e9a3a95b5b84823fdde4785b5f06b8af811 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:08 +0000 Subject: [PATCH 031/207] Translated using Weblate (Romanian) Currently translated at 32.4% (151 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/ --- public/locales/ro/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json index a1f62db2..535ecb7d 100644 --- a/public/locales/ro/common.json +++ b/public/locales/ro/common.json @@ -134,13 +134,17 @@ "sonarr": { "wanted": "Dorite", "queued": "În coadă", - "series": "Seriale" + "series": "Seriale", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "queued": "În coadă", "wanted": "Dorite", "movies": "Filme", - "missing": "Missing" + "missing": "Missing", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Dorite", From a2a6cd150ff1e11c88eb4b311d491de005b68c6a Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:08 +0000 Subject: [PATCH 032/207] Translated using Weblate (Portuguese (Brazil)) Currently translated at 87.0% (405 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/ --- public/locales/pt-BR/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json index bc405db0..d4392e18 100644 --- a/public/locales/pt-BR/common.json +++ b/public/locales/pt-BR/common.json @@ -112,13 +112,17 @@ "sonarr": { "wanted": "Desejado", "queued": "Na fila", - "series": "Séries" + "series": "Séries", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Desejado", "queued": "Na fila", "movies": "Filmes", - "missing": "Faltando" + "missing": "Faltando", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Desejado", From db7fdd2a4f9045eda6522934df5f4c084668f9fe Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:18 +0000 Subject: [PATCH 033/207] Translated using Weblate (Yue (Traditional)) Currently translated at 25.3% (118 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/ --- public/locales/yue/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json index 5ab69f88..ce9af7e4 100644 --- a/public/locales/yue/common.json +++ b/public/locales/yue/common.json @@ -94,13 +94,17 @@ "sonarr": { "wanted": "想睇", "queued": "排緊隊", - "series": "電視劇" + "series": "電視劇", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "想睇", "queued": "排緊隊", "movies": "電影", - "missing": "Missing" + "missing": "Missing", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "想睇", From 95ecc5546777c7fd4dd266883fd0256de3679122 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:16 +0000 Subject: [PATCH 034/207] Translated using Weblate (Finnish) Currently translated at 38.2% (178 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/ --- public/locales/fi/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json index aad674a1..07dbb8e5 100644 --- a/public/locales/fi/common.json +++ b/public/locales/fi/common.json @@ -94,13 +94,17 @@ "sonarr": { "wanted": "Haluttu", "queued": "Jonossa", - "series": "Sarja" + "series": "Sarja", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Haluttu", "queued": "Jonossa", "movies": "Elokuvia", - "missing": "Missing" + "missing": "Missing", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Haluttu", From a00ef03ce52b668e75dbb2ea7ad7d71c719a12ca Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:17 +0000 Subject: [PATCH 035/207] Translated using Weblate (Telugu) Currently translated at 46.4% (216 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/ --- public/locales/te/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/te/common.json b/public/locales/te/common.json index e357b266..867baeae 100644 --- a/public/locales/te/common.json +++ b/public/locales/te/common.json @@ -111,13 +111,17 @@ "sonarr": { "wanted": "కావలెను", "queued": "క్యూయూఎడ్", - "series": "సిరీస్" + "series": "సిరీస్", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "కావలెను", "queued": "క్యూయూఎడ్", "movies": "సినిమాలు", - "missing": "మిస్సింగ్" + "missing": "మిస్సింగ్", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "కావలెను", From 3ab5862bf1f403cd772ce22201d4439d7cfc5345 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:17 +0000 Subject: [PATCH 036/207] Translated using Weblate (Bulgarian) Currently translated at 9.8% (46 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/ --- public/locales/bg/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json index 3fec6dbd..e567de17 100644 --- a/public/locales/bg/common.json +++ b/public/locales/bg/common.json @@ -117,13 +117,17 @@ "sonarr": { "wanted": "Wanted", "queued": "Queued", - "series": "Series" + "series": "Series", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Wanted", "queued": "Queued", "movies": "Movies", - "missing": "Missing" + "missing": "Missing", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Wanted", From 7bcd405f77cd9d8a62094c90b44173b28931e641 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:18 +0000 Subject: [PATCH 037/207] Translated using Weblate (Turkish) Currently translated at 84.7% (394 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/ --- public/locales/tr/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index a2a872f4..d2f9667d 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -117,13 +117,17 @@ "sonarr": { "wanted": "Aranan", "queued": "Kuyrukta", - "series": "Seriler" + "series": "Seriler", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Aranan", "queued": "Kuyrukta", "movies": "Filmler", - "missing": "Kayıp" + "missing": "Kayıp", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Aranan", From 9523f72c979a91971a740767b7c087ab51f27139 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:10 +0000 Subject: [PATCH 038/207] Translated using Weblate (Serbian) Currently translated at 1.9% (9 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/ --- public/locales/sr/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json index b30db3fe..5c6e0b2e 100644 --- a/public/locales/sr/common.json +++ b/public/locales/sr/common.json @@ -117,13 +117,17 @@ "sonarr": { "wanted": "Wanted", "queued": "Queued", - "series": "Series" + "series": "Series", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Wanted", "queued": "Queued", "movies": "Movies", - "missing": "Missing" + "missing": "Missing", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Wanted", From 577f8fecfdae364f58b371111c892c60ca8a408b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:10 +0000 Subject: [PATCH 039/207] Translated using Weblate (Arabic) Currently translated at 56.1% (261 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/ --- public/locales/ar/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json index 39b77411..cecfb771 100644 --- a/public/locales/ar/common.json +++ b/public/locales/ar/common.json @@ -179,13 +179,17 @@ "sonarr": { "wanted": "مطلوب", "queued": "في الإنتظار", - "series": "سلسلة" + "series": "سلسلة", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "مطلوب", "missing": "مفقود", "queued": "في الإنتظار", - "movies": "أفلام" + "movies": "أفلام", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "مطلوب", From 0447bb04131199e9d89400e8bc0fcd871061b6e6 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:32:56 +0000 Subject: [PATCH 040/207] Translated using Weblate (Czech) Currently translated at 95.6% (445 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/ --- public/locales/cs/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json index 6088851b..e4699e86 100644 --- a/public/locales/cs/common.json +++ b/public/locales/cs/common.json @@ -133,13 +133,17 @@ "sonarr": { "wanted": "Hledané", "queued": "Ve frontě", - "series": "Seriály" + "series": "Seriály", + "unknown": "Unknown", + "queue": "Queue" }, "radarr": { "wanted": "Hledané", "missing": "Chybějící", "queued": "Ve frontě", - "movies": "Filmy" + "movies": "Filmy", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Hledané", From e398e4acc55b9380b82975d281f2b4ba20bf9ba2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:32:59 +0000 Subject: [PATCH 041/207] Translated using Weblate (Danish) Currently translated at 42.3% (197 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/ --- public/locales/da/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/da/common.json b/public/locales/da/common.json index 3769da6f..ccaa5d52 100644 --- a/public/locales/da/common.json +++ b/public/locales/da/common.json @@ -9,7 +9,9 @@ "queued": "I Kø", "movies": "Film", "wanted": "Ønskede", - "missing": "Mangler" + "missing": "Mangler", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Ønsket", @@ -264,7 +266,9 @@ "sonarr": { "wanted": "Ønsket", "queued": "I Kø", - "series": "Serier" + "series": "Serier", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "wanted": "Ønskede", From 0f5deba5e34bd40bf747162f7758b3010335acb4 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:00 +0000 Subject: [PATCH 042/207] Translated using Weblate (Malay) Currently translated at 54.1% (252 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/ --- public/locales/ms/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json index da42ff44..716049ef 100644 --- a/public/locales/ms/common.json +++ b/public/locales/ms/common.json @@ -233,13 +233,17 @@ "sonarr": { "wanted": "Mahu", "queued": "Dibaris Gilir", - "series": "Bersiri" + "series": "Bersiri", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Mahu", "missing": "Hilang", "queued": "Dibaris Gilir", - "movies": "Filem" + "movies": "Filem", + "queue": "Queue", + "unknown": "Unknown" }, "bazarr": { "missingEpisodes": "Episod Yang Hilang", From 93440ae8d15295785c4f4ab9c7dc34a35741566f Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:01 +0000 Subject: [PATCH 043/207] Translated using Weblate (Hindi) Currently translated at 1.9% (9 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/ --- public/locales/hi/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json index 6736caf0..4efc87e0 100644 --- a/public/locales/hi/common.json +++ b/public/locales/hi/common.json @@ -155,13 +155,17 @@ "sonarr": { "wanted": "Wanted", "queued": "Queued", - "series": "Series" + "series": "Series", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Wanted", "missing": "Missing", "queued": "Queued", - "movies": "Movies" + "movies": "Movies", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Wanted", From d98607072c723fd415d9adfada6a37621d18cb16 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:32:56 +0000 Subject: [PATCH 044/207] Translated using Weblate (Esperanto) Currently translated at 31.3% (146 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/ --- public/locales/eo/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json index 50d305ac..8aa16f14 100644 --- a/public/locales/eo/common.json +++ b/public/locales/eo/common.json @@ -131,13 +131,17 @@ "sonarr": { "wanted": "Wanted", "queued": "Queued", - "series": "Serio" + "series": "Serio", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Wanted", "missing": "Missing", "queued": "Queued", - "movies": "Filmoj" + "movies": "Filmoj", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Wanted", From 4f386bb2af9274602d2ad55b4e30bc2076dacbd2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:32:57 +0000 Subject: [PATCH 045/207] Translated using Weblate (Ukrainian) Currently translated at 99.1% (461 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/ --- public/locales/uk/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index 37320dfd..2561f4a8 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -232,13 +232,17 @@ "sonarr": { "wanted": "Розшукується", "queued": "У черзі", - "series": "Серії" + "series": "Серії", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Розшукується", "missing": "Відсутній", "queued": "У черзі", - "movies": "Фільми" + "movies": "Фільми", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Розшукується", From bb09d85d807f437ea4d31110ea7482f09b4bb122 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:01 +0000 Subject: [PATCH 046/207] Translated using Weblate (Japanese) Currently translated at 80.4% (374 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/ --- public/locales/ja/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index bcca3d2a..1a96786b 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -193,13 +193,17 @@ "sonarr": { "wanted": "募集中", "queued": "待機中", - "series": "シリーズ" + "series": "シリーズ", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "募集中", "missing": "不明", "queued": "キュー", - "movies": "映画" + "movies": "映画", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "募集中", From 249dfa7a92d167cbe749d8b550b297d261d817ed Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:32:57 +0000 Subject: [PATCH 047/207] Translated using Weblate (Latvian) Currently translated at 25.5% (119 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/ --- public/locales/lv/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/lv/common.json b/public/locales/lv/common.json index fa73f2c7..3e4c9173 100644 --- a/public/locales/lv/common.json +++ b/public/locales/lv/common.json @@ -154,13 +154,17 @@ "sonarr": { "wanted": "Wanted", "queued": "Queued", - "series": "Series" + "series": "Series", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Wanted", "missing": "Missing", "queued": "Queued", - "movies": "Filmas" + "movies": "Filmas", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Wanted", From a1fedf98e5fc6f4019446ecaeef3f09b0d9724c7 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:32:54 +0000 Subject: [PATCH 048/207] Translated using Weblate (Thai) Currently translated at 10.1% (47 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/ --- public/locales/th/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/th/common.json b/public/locales/th/common.json index 65c1b90a..660744b7 100644 --- a/public/locales/th/common.json +++ b/public/locales/th/common.json @@ -190,7 +190,9 @@ "sonarr": { "wanted": "Wanted", "queued": "Queued", - "series": "Series" + "series": "Series", + "queue": "Queue", + "unknown": "Unknown" }, "readarr": { "queued": "Queued", @@ -216,7 +218,9 @@ "wanted": "Wanted", "missing": "Missing", "queued": "Queued", - "movies": "Movies" + "movies": "Movies", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Wanted", From 715f3d9d27e17f0ac25bb1a3c45ebf79e342da3b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:12 +0000 Subject: [PATCH 049/207] Translated using Weblate (Slovak) Currently translated at 1.9% (9 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/ --- public/locales/sk/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index a66ef5e6..70c699f8 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -273,13 +273,17 @@ "sonarr": { "wanted": "Wanted", "queued": "Queued", - "series": "Series" + "series": "Series", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Wanted", "missing": "Missing", "queued": "Queued", - "movies": "Movies" + "movies": "Movies", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Wanted", From b085a1a2d102b1f81c1228decdd6492d11b24b43 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:13 +0000 Subject: [PATCH 050/207] Translated using Weblate (Korean) Currently translated at 37.4% (174 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/ --- public/locales/ko/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json index 4e5e6298..56e8dd77 100644 --- a/public/locales/ko/common.json +++ b/public/locales/ko/common.json @@ -163,13 +163,17 @@ "sonarr": { "wanted": "요청", "queued": "대기 중", - "series": "시리즈" + "series": "시리즈", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "요청", "missing": "빠짐", "queued": "대기 중", - "movies": "영화" + "movies": "영화", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "요청", From 614ce65871fd3bdccce6267e0aa14a78592d9252 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:32:55 +0000 Subject: [PATCH 051/207] Translated using Weblate (Greek) Currently translated at 30.9% (144 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/ --- public/locales/el/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/el/common.json b/public/locales/el/common.json index d42fdfe5..19f4a0ae 100644 --- a/public/locales/el/common.json +++ b/public/locales/el/common.json @@ -206,7 +206,9 @@ "sonarr": { "series": "Σειρές", "wanted": "Επιθυμούντε", - "queued": "Σε σειρά" + "queued": "Σε σειρά", + "queue": "Queue", + "unknown": "Unknown" }, "downloadstation": { "download": "Μεταφόρτωση", @@ -218,7 +220,9 @@ "wanted": "Επιθυμούντε", "missing": "Απουσιάζει", "queued": "Σε σειρά", - "movies": "Ταινίες" + "movies": "Ταινίες", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Θέλετε", From 0e9ca01c185f84fbd659b6cd8bd21da98233d4bb Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:33:02 +0000 Subject: [PATCH 052/207] Translated using Weblate (Slovenian) Currently translated at 96.7% (450 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/ --- public/locales/sl/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/sl/common.json b/public/locales/sl/common.json index afca8429..7632e2aa 100644 --- a/public/locales/sl/common.json +++ b/public/locales/sl/common.json @@ -235,13 +235,17 @@ "sonarr": { "wanted": "Iskano", "queued": "V vrsti", - "series": "Serije" + "series": "Serije", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Iskano", "missing": "Manjka", "queued": "V vrsti", - "movies": "Filmi" + "movies": "Filmi", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Iskano", From bcd92898495945d67d210e63e6d8730420377b3d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Tue, 6 Jun 2023 20:32:58 +0000 Subject: [PATCH 053/207] Translated using Weblate (Indonesian) Currently translated at 3.2% (15 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/ --- public/locales/id/common.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/public/locales/id/common.json b/public/locales/id/common.json index e9169cbd..c36ae790 100644 --- a/public/locales/id/common.json +++ b/public/locales/id/common.json @@ -55,13 +55,17 @@ "sonarr": { "wanted": "Wanted", "queued": "Queued", - "series": "Series" + "series": "Series", + "queue": "Queue", + "unknown": "Unknown" }, "radarr": { "wanted": "Wanted", "missing": "Missing", "queued": "Queued", - "movies": "Movies" + "movies": "Movies", + "queue": "Queue", + "unknown": "Unknown" }, "lidarr": { "wanted": "Wanted", From 91e0ec2f830a3135b5e12715d4622ebe8e685490 Mon Sep 17 00:00:00 2001 From: Denis Papec Date: Wed, 7 Jun 2023 00:53:10 +0100 Subject: [PATCH 054/207] Fixes for portainer and kubernetes widget error messages, and error messages for services behind the reverse proxy Signed-off-by: Denis Papec --- src/components/services/widget/error.jsx | 6 ++++-- src/widgets/kubernetes/component.jsx | 2 +- src/widgets/portainer/component.jsx | 9 +++------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/components/services/widget/error.jsx b/src/components/services/widget/error.jsx index 587c572f..cf5e1366 100644 --- a/src/components/services/widget/error.jsx +++ b/src/components/services/widget/error.jsx @@ -9,10 +9,12 @@ function displayData(data) { return (data.type === 'Buffer') ? Buffer.from(data).toString() : JSON.stringify(data, 4); } -export default function Error({ error: err }) { +export default function Error({ error }) { const { t } = useTranslation(); - const { error } = err?.data ?? { error: err }; + if (error?.data?.error) { + error = error.data.error; // eslint-disable-line no-param-reassign + } return (
    diff --git a/src/widgets/kubernetes/component.jsx b/src/widgets/kubernetes/component.jsx index c4d67553..e756e4be 100644 --- a/src/widgets/kubernetes/component.jsx +++ b/src/widgets/kubernetes/component.jsx @@ -16,7 +16,7 @@ export default function Component({ service }) { `/api/kubernetes/stats/${widget.namespace}/${widget.app}?${podSelectorString}`); if (statsError || statusError) { - return ; + return ; } if (statusData && statusData.status !== "running") { diff --git a/src/widgets/portainer/component.jsx b/src/widgets/portainer/component.jsx index aab9eba1..7da289c4 100644 --- a/src/widgets/portainer/component.jsx +++ b/src/widgets/portainer/component.jsx @@ -1,12 +1,8 @@ -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: containersData, error: containersError } = useWidgetAPI(widget, "docker/containers/json", { @@ -27,8 +23,9 @@ export default function Component({ service }) { ); } - if (containersData.error) { - return ; + if (containersData.error || !Array.isArray(containersData)) { + // containersData can be itself an error object + return ; } const running = containersData.filter((c) => c.State === "running").length; From c92d1caf801d3132625f5b47488d0a363bd57cb0 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 7 Jun 2023 13:37:38 -0700 Subject: [PATCH 055/207] Allow useWidgetAPI to not actually send a request --- src/utils/proxy/use-widget-api.js | 6 +++++- src/widgets/lidarr/component.jsx | 8 +++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/utils/proxy/use-widget-api.js b/src/utils/proxy/use-widget-api.js index 52e986e1..e4744038 100644 --- a/src/utils/proxy/use-widget-api.js +++ b/src/utils/proxy/use-widget-api.js @@ -7,7 +7,11 @@ export default function useWidgetAPI(widget, ...options) { if (options && options[1]?.refreshInterval) { config.refreshInterval = options[1].refreshInterval; } - const { data, error, mutate } = useSWR(formatProxyUrl(widget, ...options), config); + let url = formatProxyUrl(widget, ...options) + if (options[0] === "") { + url = null + } + const { data, error, mutate } = useSWR(url, config); // make the data error the top-level error return { data, error: data?.error ?? error, mutate } } diff --git a/src/widgets/lidarr/component.jsx b/src/widgets/lidarr/component.jsx index a6aa82c7..77d831f8 100644 --- a/src/widgets/lidarr/component.jsx +++ b/src/widgets/lidarr/component.jsx @@ -9,7 +9,9 @@ export default function Component({ service }) { const { widget } = service; - const { data: albumsData, error: albumsError } = useWidgetAPI(widget, "album"); + // album API endpoint can get massive, so we prevent calling if not included in fields see https://github.com/benphelps/homepage/discussions/1577 + const showAlbums = widget.fields?.includes('albums') || !widget.fields; + const { data: albumsData, error: albumsError } = useWidgetAPI(widget, showAlbums ? "album" : ""); const { data: wantedData, error: wantedError } = useWidgetAPI(widget, "wanted/missing"); const { data: queueData, error: queueError } = useWidgetAPI(widget, "queue/status"); @@ -18,7 +20,7 @@ export default function Component({ service }) { return ; } - if (!albumsData || !wantedData || !queueData) { + if ((showAlbums && !albumsData) || !wantedData || !queueData) { return ( @@ -32,7 +34,7 @@ export default function Component({ service }) { - + {showAlbums && } ); } From 4245f1070ad4ce03bf140b7beb9dc127a6ce9bf3 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 7 Jun 2023 14:06:23 -0700 Subject: [PATCH 056/207] fix docker service discovery, code styling --- src/utils/config/service-helpers.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index 00c236eb..95d4790b 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -62,13 +62,10 @@ export async function servicesFromDocker() { const serviceServers = await Promise.all( Object.keys(servers).map(async (serverName) => { - const isSwarm = servers[serverName].swarm ?? false; - try { - const listProperties = { all: true }; - const labelProperty = (isSwarm) ? 'Spec.Labels' : 'Labels'; - const nameProperty = (isSwarm) ? 'Spec.Name' : 'Name[0]'; + const isSwarm = !!servers[serverName].swarm; const docker = new Docker(getDockerArguments(serverName).conn); + const listProperties = { all: true }; const containers = await ((isSwarm) ? docker.listServices(listProperties) : docker.listContainers(listProperties)); // bad docker connections can result in a object? @@ -79,18 +76,19 @@ export async function servicesFromDocker() { const discovered = containers.map((container) => { let constructedService = null; - const labels = shvl.get(container, labelProperty); + const containerLabels = isSwarm ? shvl.get(container, 'Spec.Labels') : container.Labels; + const containerName = isSwarm ? shvl.get(container, 'Spec.Name') : container.Names[0]; - Object.keys(labels).forEach((label) => { + Object.keys(containerLabels).forEach((label) => { if (label.startsWith("homepage.")) { if (!constructedService) { constructedService = { - container: shvl.get(container, nameProperty).replace(/^\//, ""), + container: containerName.replace(/^\//, ""), server: serverName, type: 'service' }; } - shvl.set(constructedService, label.replace("homepage.", ""), substituteEnvironmentVars(labels[label])); + shvl.set(constructedService, label.replace("homepage.", ""), substituteEnvironmentVars(containerLabels[label])); } }); From ea50a851f3ec4a2f8b3513be6984953050f0edbb Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 8 Jun 2023 07:12:14 -0700 Subject: [PATCH 057/207] Change lidarr to artist instead of album --- public/locales/en/common.json | 2 +- src/widgets/lidarr/component.jsx | 14 ++++++-------- src/widgets/lidarr/widget.js | 7 ++----- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/public/locales/en/common.json b/public/locales/en/common.json index e20e1908..c90287da 100755 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -209,7 +209,7 @@ "lidarr": { "wanted": "Wanted", "queued": "Queued", - "albums": "Albums" + "artists": "Artists" }, "readarr": { "wanted": "Wanted", diff --git a/src/widgets/lidarr/component.jsx b/src/widgets/lidarr/component.jsx index 77d831f8..68360d82 100644 --- a/src/widgets/lidarr/component.jsx +++ b/src/widgets/lidarr/component.jsx @@ -9,23 +9,21 @@ export default function Component({ service }) { const { widget } = service; - // album API endpoint can get massive, so we prevent calling if not included in fields see https://github.com/benphelps/homepage/discussions/1577 - const showAlbums = widget.fields?.includes('albums') || !widget.fields; - const { data: albumsData, error: albumsError } = useWidgetAPI(widget, showAlbums ? "album" : ""); + const { data: artistsData, error: artistsError } = useWidgetAPI(widget, "artist"); const { data: wantedData, error: wantedError } = useWidgetAPI(widget, "wanted/missing"); const { data: queueData, error: queueError } = useWidgetAPI(widget, "queue/status"); - if (albumsError || wantedError || queueError) { - const finalError = albumsError ?? wantedError ?? queueError; + if (artistsError || wantedError || queueError) { + const finalError = artistsError ?? wantedError ?? queueError; return ; } - if ((showAlbums && !albumsData) || !wantedData || !queueData) { + if (!artistsData || !wantedData || !queueData) { return ( - + ); } @@ -34,7 +32,7 @@ export default function Component({ service }) { - {showAlbums && } + ); } diff --git a/src/widgets/lidarr/widget.js b/src/widgets/lidarr/widget.js index 6ff93254..55975e63 100644 --- a/src/widgets/lidarr/widget.js +++ b/src/widgets/lidarr/widget.js @@ -6,11 +6,8 @@ const widget = { proxyHandler: genericProxyHandler, mappings: { - album: { - endpoint: "album", - map: (data) => ({ - have: jsonArrayFilter(data, (item) => item?.statistics?.percentOfTracks === 100).length, - }), + artist: { + endpoint: "artist", }, "wanted/missing": { endpoint: "wanted/missing", From 07c0c0faf4a9687377cb532e0b6b9e0901ab0364 Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Wed, 7 Jun 2023 14:33:09 +0000 Subject: [PATCH 058/207] Translated using Weblate (Spanish) Currently translated at 100.0% (465 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/ --- public/locales/es/common.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/locales/es/common.json b/public/locales/es/common.json index 5d528e64..b0efcd6b 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -67,16 +67,16 @@ "wanted": "Buscando", "queued": "En cola", "series": "Series", - "queue": "Queue", - "unknown": "Unknown" + "queue": "Poner a la cola", + "unknown": "Desconocido" }, "radarr": { "wanted": "Buscando", "queued": "En cola", "movies": "Películas", "missing": "Faltan", - "queue": "Queue", - "unknown": "Unknown" + "queue": "Poner a la cola", + "unknown": "Desconocido" }, "readarr": { "wanted": "Buscando", From b934fc429deea078f864ab2179352739ed208781 Mon Sep 17 00:00:00 2001 From: Nonoss117 Date: Tue, 6 Jun 2023 21:45:19 +0000 Subject: [PATCH 059/207] Translated using Weblate (French) Currently translated at 100.0% (465 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/ --- public/locales/fr/common.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 12f2098c..269a1adb 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -67,16 +67,16 @@ "wanted": "Demande", "queued": "Attente", "series": "Séries", - "queue": "Queue", - "unknown": "Unknown" + "queue": "Attente", + "unknown": "Inconnu" }, "radarr": { "wanted": "Demande", "queued": "Attente", "movies": "Films", "missing": "Manquant", - "queue": "Queue", - "unknown": "Unknown" + "queue": "Attente", + "unknown": "Inconnu" }, "readarr": { "wanted": "Demande", From 7588dd03dbdce48e12bdb8721d0e84703e9ff57a Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 7 Jun 2023 08:25:34 +0000 Subject: [PATCH 060/207] Translated using Weblate (Ukrainian) Currently translated at 100.0% (465 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/ --- public/locales/uk/common.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index 2561f4a8..08c16483 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -233,16 +233,16 @@ "wanted": "Розшукується", "queued": "У черзі", "series": "Серії", - "queue": "Queue", - "unknown": "Unknown" + "queue": "Черга", + "unknown": "Невідомо" }, "radarr": { "wanted": "Розшукується", "missing": "Відсутній", "queued": "У черзі", "movies": "Фільми", - "queue": "Queue", - "unknown": "Unknown" + "queue": "Черга", + "unknown": "Невідомо" }, "lidarr": { "wanted": "Розшукується", From 3d0cc6aeeba5e191b68d0dc12901baa868fce10a Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 8 Jun 2023 16:16:16 +0200 Subject: [PATCH 061/207] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ --- public/locales/ar/common.json | 3 +-- public/locales/bg/common.json | 3 +-- public/locales/ca/common.json | 3 +-- public/locales/cs/common.json | 3 +-- public/locales/da/common.json | 3 +-- public/locales/de/common.json | 3 +-- public/locales/el/common.json | 3 +-- public/locales/eo/common.json | 3 +-- public/locales/es/common.json | 3 +-- public/locales/fi/common.json | 3 +-- public/locales/fr/common.json | 3 +-- public/locales/he/common.json | 3 +-- public/locales/hi/common.json | 3 +-- public/locales/hr/common.json | 3 +-- public/locales/hu/common.json | 1 - public/locales/id/common.json | 3 +-- public/locales/it/common.json | 3 +-- public/locales/ja/common.json | 3 +-- public/locales/ko/common.json | 3 +-- public/locales/lv/common.json | 3 +-- public/locales/ms/common.json | 1 - public/locales/nb-NO/common.json | 3 +-- public/locales/nl/common.json | 3 +-- public/locales/pl/common.json | 3 +-- public/locales/pt-BR/common.json | 3 +-- public/locales/pt/common.json | 3 +-- public/locales/ro/common.json | 3 +-- public/locales/ru/common.json | 3 +-- public/locales/sk/common.json | 3 +-- public/locales/sl/common.json | 3 +-- public/locales/sr/common.json | 3 +-- public/locales/sv/common.json | 3 +-- public/locales/te/common.json | 3 +-- public/locales/th/common.json | 3 +-- public/locales/tr/common.json | 3 +-- public/locales/uk/common.json | 3 +-- public/locales/vi/common.json | 3 +-- public/locales/yue/common.json | 3 +-- public/locales/zh-CN/common.json | 3 +-- public/locales/zh-Hant/common.json | 3 +-- 40 files changed, 38 insertions(+), 78 deletions(-) diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json index cecfb771..7562e8ea 100644 --- a/public/locales/ar/common.json +++ b/public/locales/ar/common.json @@ -193,8 +193,7 @@ }, "lidarr": { "wanted": "مطلوب", - "queued": "في الإنتظار", - "albums": "ألبومات" + "queued": "في الإنتظار" }, "readarr": { "wanted": "مطلوب", diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json index e567de17..7b96b3d0 100644 --- a/public/locales/bg/common.json +++ b/public/locales/bg/common.json @@ -131,8 +131,7 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued", - "albums": "Albums" + "queued": "Queued" }, "readarr": { "wanted": "Wanted", diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json index b133c24f..399a9649 100644 --- a/public/locales/ca/common.json +++ b/public/locales/ca/common.json @@ -176,8 +176,7 @@ }, "lidarr": { "wanted": "Volgut", - "queued": "En cua", - "albums": "Àlbums" + "queued": "En cua" }, "adguard": { "queries": "Consultes", diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json index e4699e86..e38cc629 100644 --- a/public/locales/cs/common.json +++ b/public/locales/cs/common.json @@ -147,8 +147,7 @@ }, "lidarr": { "wanted": "Hledané", - "queued": "Ve frontě", - "albums": "Alba" + "queued": "Ve frontě" }, "readarr": { "wanted": "Hledané", diff --git a/public/locales/da/common.json b/public/locales/da/common.json index ccaa5d52..7f4ceffd 100644 --- a/public/locales/da/common.json +++ b/public/locales/da/common.json @@ -15,8 +15,7 @@ }, "lidarr": { "wanted": "Ønsket", - "queued": "I Kø", - "albums": "Albums" + "queued": "I Kø" }, "jellyseerr": { "available": "Tilgængelig", diff --git a/public/locales/de/common.json b/public/locales/de/common.json index 0d664d99..5d28be49 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -176,8 +176,7 @@ }, "lidarr": { "wanted": "Gesucht", - "queued": "In Warteschlange", - "albums": "Alben" + "queued": "In Warteschlange" }, "adguard": { "queries": "Anfragen", diff --git a/public/locales/el/common.json b/public/locales/el/common.json index 19f4a0ae..a2eb9ac5 100644 --- a/public/locales/el/common.json +++ b/public/locales/el/common.json @@ -226,8 +226,7 @@ }, "lidarr": { "wanted": "Θέλετε", - "queued": "Στη σειρά", - "albums": "Δίσκοι" + "queued": "Στη σειρά" }, "readarr": { "wanted": "Θέλετε", diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json index 8aa16f14..c489979d 100644 --- a/public/locales/eo/common.json +++ b/public/locales/eo/common.json @@ -145,8 +145,7 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued", - "albums": "Albumoj" + "queued": "Queued" }, "readarr": { "wanted": "Wanted", diff --git a/public/locales/es/common.json b/public/locales/es/common.json index b0efcd6b..129946fc 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -176,8 +176,7 @@ }, "lidarr": { "queued": "En cola", - "wanted": "Buscando", - "albums": "Álbumes" + "wanted": "Buscando" }, "adguard": { "queries": "Consultas", diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json index 07dbb8e5..0dddbbce 100644 --- a/public/locales/fi/common.json +++ b/public/locales/fi/common.json @@ -108,8 +108,7 @@ }, "lidarr": { "wanted": "Haluttu", - "queued": "Jonossa", - "albums": "Albumeja" + "queued": "Jonossa" }, "readarr": { "wanted": "Haluttu", diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 269a1adb..051af841 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -176,8 +176,7 @@ }, "lidarr": { "wanted": "Demandé", - "queued": "En queue", - "albums": "Albums" + "queued": "En queue" }, "adguard": { "queries": "Requêtes", diff --git a/public/locales/he/common.json b/public/locales/he/common.json index 9e682c20..ceed0eea 100644 --- a/public/locales/he/common.json +++ b/public/locales/he/common.json @@ -108,8 +108,7 @@ }, "lidarr": { "wanted": "מבוקש", - "queued": "בתור", - "albums": "אלבומים" + "queued": "בתור" }, "readarr": { "wanted": "מבוקש", diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json index 4efc87e0..10488f5d 100644 --- a/public/locales/hi/common.json +++ b/public/locales/hi/common.json @@ -169,8 +169,7 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued", - "albums": "Albums" + "queued": "Queued" }, "overseerr": { "pending": "Pending", diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json index fce370ce..48a8df02 100644 --- a/public/locales/hr/common.json +++ b/public/locales/hr/common.json @@ -139,8 +139,7 @@ }, "lidarr": { "wanted": "Zatraženo", - "queued": "U redu čekanja", - "albums": "Albumi" + "queued": "U redu čekanja" }, "readarr": { "wanted": "Zatraženo", diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json index 98687d9f..2164d696 100644 --- a/public/locales/hu/common.json +++ b/public/locales/hu/common.json @@ -31,7 +31,6 @@ "healthy": "Healthy" }, "lidarr": { - "albums": "Albumok", "wanted": "Keresett", "queued": "Sorban áll" }, diff --git a/public/locales/id/common.json b/public/locales/id/common.json index c36ae790..eb63e939 100644 --- a/public/locales/id/common.json +++ b/public/locales/id/common.json @@ -69,8 +69,7 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued", - "albums": "Albums" + "queued": "Queued" }, "readarr": { "wanted": "Wanted", diff --git a/public/locales/it/common.json b/public/locales/it/common.json index 5eed8b41..b78706f3 100644 --- a/public/locales/it/common.json +++ b/public/locales/it/common.json @@ -176,8 +176,7 @@ }, "lidarr": { "wanted": "Mancanti", - "queued": "In coda", - "albums": "Album" + "queued": "In coda" }, "adguard": { "queries": "Interrogazioni", diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index 1a96786b..8625cb15 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -207,8 +207,7 @@ }, "lidarr": { "wanted": "募集中", - "queued": "キュー", - "albums": "アルバム" + "queued": "キュー" }, "readarr": { "wanted": "募集中", diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json index 56e8dd77..26e8475b 100644 --- a/public/locales/ko/common.json +++ b/public/locales/ko/common.json @@ -177,8 +177,7 @@ }, "lidarr": { "wanted": "요청", - "queued": "대기 중", - "albums": "앨범" + "queued": "대기 중" }, "readarr": { "wanted": "요청", diff --git a/public/locales/lv/common.json b/public/locales/lv/common.json index 3e4c9173..e38f8671 100644 --- a/public/locales/lv/common.json +++ b/public/locales/lv/common.json @@ -168,8 +168,7 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued", - "albums": "Albumi" + "queued": "Queued" }, "readarr": { "wanted": "Wanted", diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json index 716049ef..d57b2805 100644 --- a/public/locales/ms/common.json +++ b/public/locales/ms/common.json @@ -33,7 +33,6 @@ }, "lidarr": { "queued": "Dibaris Gilir", - "albums": "Album", "wanted": "Mahu" }, "readarr": { diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json index 5761e333..5f6862a5 100644 --- a/public/locales/nb-NO/common.json +++ b/public/locales/nb-NO/common.json @@ -176,8 +176,7 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued", - "albums": "Albums" + "queued": "Queued" }, "adguard": { "queries": "Queries", diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json index fad081f6..410f40dd 100644 --- a/public/locales/nl/common.json +++ b/public/locales/nl/common.json @@ -176,8 +176,7 @@ }, "lidarr": { "wanted": "Gezocht", - "queued": "In de wachtrij", - "albums": "Albums" + "queued": "In de wachtrij" }, "adguard": { "queries": "Queries", diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index 18a57078..7413c2ba 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -124,8 +124,7 @@ }, "lidarr": { "wanted": "Poszukiwane", - "queued": "W kolejce", - "albums": "Albumy" + "queued": "W kolejce" }, "readarr": { "wanted": "Poszukiwane", diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json index d4392e18..fbd72df2 100644 --- a/public/locales/pt-BR/common.json +++ b/public/locales/pt-BR/common.json @@ -126,8 +126,7 @@ }, "lidarr": { "wanted": "Desejado", - "queued": "Na fila", - "albums": "Álbuns" + "queued": "Na fila" }, "readarr": { "wanted": "Desejado", diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index ef5f7cd8..483e23f8 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -189,8 +189,7 @@ }, "lidarr": { "queued": "Enfileirado", - "wanted": "Desejado", - "albums": "Álbuns" + "wanted": "Desejado" }, "adguard": { "queries": "Consultas", diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json index 535ecb7d..6bfc767c 100644 --- a/public/locales/ro/common.json +++ b/public/locales/ro/common.json @@ -148,8 +148,7 @@ }, "lidarr": { "wanted": "Dorite", - "queued": "În coadă", - "albums": "Albume" + "queued": "În coadă" }, "readarr": { "wanted": "Dorite", diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index 5e16f154..5b604ec7 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -176,8 +176,7 @@ }, "lidarr": { "wanted": "Хотел", - "queued": "В очереди", - "albums": "Альбомы" + "queued": "В очереди" }, "adguard": { "queries": "Запросы", diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index 70c699f8..6a294895 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -287,8 +287,7 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued", - "albums": "Albums" + "queued": "Queued" }, "readarr": { "wanted": "Wanted", diff --git a/public/locales/sl/common.json b/public/locales/sl/common.json index 7632e2aa..49be2e8a 100644 --- a/public/locales/sl/common.json +++ b/public/locales/sl/common.json @@ -249,8 +249,7 @@ }, "lidarr": { "wanted": "Iskano", - "queued": "V vrsti", - "albums": "Albumi" + "queued": "V vrsti" }, "readarr": { "wanted": "Iskano", diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json index 5c6e0b2e..2a2971b2 100644 --- a/public/locales/sr/common.json +++ b/public/locales/sr/common.json @@ -131,8 +131,7 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued", - "albums": "Albums" + "queued": "Queued" }, "readarr": { "wanted": "Wanted", diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json index 0da6efb3..3861157d 100644 --- a/public/locales/sv/common.json +++ b/public/locales/sv/common.json @@ -102,8 +102,7 @@ }, "lidarr": { "wanted": "Eftersöker", - "queued": "I kö", - "albums": "Album" + "queued": "I kö" }, "readarr": { "wanted": "Eftersökt", diff --git a/public/locales/te/common.json b/public/locales/te/common.json index 867baeae..c9b6c7d8 100644 --- a/public/locales/te/common.json +++ b/public/locales/te/common.json @@ -125,8 +125,7 @@ }, "lidarr": { "wanted": "కావలెను", - "queued": "క్యూయూఎడ్", - "albums": "ఆల్బములు" + "queued": "క్యూయూఎడ్" }, "bazarr": { "missingEpisodes": "ఎపిసోడ్‌లు లేవు", diff --git a/public/locales/th/common.json b/public/locales/th/common.json index 660744b7..d0ec6c6b 100644 --- a/public/locales/th/common.json +++ b/public/locales/th/common.json @@ -224,8 +224,7 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued", - "albums": "Albums" + "queued": "Queued" }, "ombi": { "pending": "Pending", diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index d2f9667d..198860f4 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -131,8 +131,7 @@ }, "lidarr": { "wanted": "Aranan", - "queued": "Kuyrukta", - "albums": "Albümler" + "queued": "Kuyrukta" }, "readarr": { "wanted": "Aranan", diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index 08c16483..6f6a4c11 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -246,8 +246,7 @@ }, "lidarr": { "wanted": "Розшукується", - "queued": "У черзі", - "albums": "Альбоми" + "queued": "У черзі" }, "traefik": { "middleware": "Проміжне програмне забезпечення", diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index 2b551546..b495c735 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -176,8 +176,7 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued", - "albums": "Albums" + "queued": "Queued" }, "adguard": { "queries": "Queries", diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json index ce9af7e4..e3a508c3 100644 --- a/public/locales/yue/common.json +++ b/public/locales/yue/common.json @@ -108,8 +108,7 @@ }, "lidarr": { "wanted": "想睇", - "queued": "排緊隊", - "albums": "專輯" + "queued": "排緊隊" }, "readarr": { "wanted": "想睇", diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json index 1b6a7ea2..cb8ba5c4 100644 --- a/public/locales/zh-CN/common.json +++ b/public/locales/zh-CN/common.json @@ -176,8 +176,7 @@ }, "lidarr": { "wanted": "订阅", - "queued": "队列", - "albums": "相册" + "queued": "队列" }, "adguard": { "queries": "查询", diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json index 7ea7c835..59886f94 100644 --- a/public/locales/zh-Hant/common.json +++ b/public/locales/zh-Hant/common.json @@ -176,8 +176,7 @@ }, "lidarr": { "wanted": "關注中", - "queued": "已加入佇列", - "albums": "專輯" + "queued": "已加入佇列" }, "adguard": { "queries": "查詢", From a19304e7e7b492aac401a245155ee8d3db4cdbb8 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:01 +0000 Subject: [PATCH 062/207] Translated using Weblate (German) Currently translated at 98.2% (457 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/ --- public/locales/de/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/de/common.json b/public/locales/de/common.json index 5d28be49..dc06f5d3 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -176,7 +176,8 @@ }, "lidarr": { "wanted": "Gesucht", - "queued": "In Warteschlange" + "queued": "In Warteschlange", + "artists": "Artists" }, "adguard": { "queries": "Anfragen", From f780deca629ce55f0eeb72ca54fae5a44943b516 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:01 +0000 Subject: [PATCH 063/207] Translated using Weblate (Spanish) Currently translated at 99.7% (464 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/ --- public/locales/es/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/es/common.json b/public/locales/es/common.json index 129946fc..1782bb92 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -176,7 +176,8 @@ }, "lidarr": { "queued": "En cola", - "wanted": "Buscando" + "wanted": "Buscando", + "artists": "Artists" }, "adguard": { "queries": "Consultas", From 2b0cddb05f094852a67d3ea946f74b03cd301c0e Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:02 +0000 Subject: [PATCH 064/207] Translated using Weblate (French) Currently translated at 99.7% (464 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/ --- public/locales/fr/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 051af841..4cc6dce6 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -176,7 +176,8 @@ }, "lidarr": { "wanted": "Demandé", - "queued": "En queue" + "queued": "En queue", + "artists": "Artists" }, "adguard": { "queries": "Requêtes", From 8e89f399790da3bd6598e3151e9808a5f0e32365 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:02 +0000 Subject: [PATCH 065/207] Translated using Weblate (Portuguese) Currently translated at 86.8% (404 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/ --- public/locales/pt/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index 483e23f8..cc6dfe46 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -189,7 +189,8 @@ }, "lidarr": { "queued": "Enfileirado", - "wanted": "Desejado" + "wanted": "Desejado", + "artists": "Artists" }, "adguard": { "queries": "Consultas", From 637f745ee7d9863d1fe80afd066ea5f76ca09a0d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:58 +0000 Subject: [PATCH 066/207] Translated using Weblate (Russian) Currently translated at 88.8% (413 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/ --- public/locales/ru/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index 5b604ec7..f89313db 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -176,7 +176,8 @@ }, "lidarr": { "wanted": "Хотел", - "queued": "В очереди" + "queued": "В очереди", + "artists": "Artists" }, "adguard": { "queries": "Запросы", From a01713c6e6e6df956390b78e9e1cfaa9efdcb998 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:58 +0000 Subject: [PATCH 067/207] Translated using Weblate (Chinese (Simplified)) Currently translated at 95.2% (443 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/ --- public/locales/zh-CN/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json index cb8ba5c4..50e36395 100644 --- a/public/locales/zh-CN/common.json +++ b/public/locales/zh-CN/common.json @@ -176,7 +176,8 @@ }, "lidarr": { "wanted": "订阅", - "queued": "队列" + "queued": "队列", + "artists": "Artists" }, "adguard": { "queries": "查询", From 8fa1831b3196f19dd5332a8411a5daa9ad868031 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:56 +0000 Subject: [PATCH 068/207] Translated using Weblate (Italian) Currently translated at 61.5% (286 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/ --- public/locales/it/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/it/common.json b/public/locales/it/common.json index b78706f3..2e666af4 100644 --- a/public/locales/it/common.json +++ b/public/locales/it/common.json @@ -176,7 +176,8 @@ }, "lidarr": { "wanted": "Mancanti", - "queued": "In coda" + "queued": "In coda", + "artists": "Artists" }, "adguard": { "queries": "Interrogazioni", From 6584a3194f9fe22e0610c6604aafeada29800b08 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:57 +0000 Subject: [PATCH 069/207] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 16.9% (79 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/ --- public/locales/nb-NO/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json index 5f6862a5..cdcda4a8 100644 --- a/public/locales/nb-NO/common.json +++ b/public/locales/nb-NO/common.json @@ -176,7 +176,8 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued" + "queued": "Queued", + "artists": "Artists" }, "adguard": { "queries": "Queries", From 877a091fc05a1b367b81a9d44f0ebc48ad5ab803 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:57 +0000 Subject: [PATCH 070/207] Translated using Weblate (Vietnamese) Currently translated at 9.4% (44 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/ --- public/locales/vi/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index b495c735..ef39cd2d 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -176,7 +176,8 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued" + "queued": "Queued", + "artists": "Artists" }, "adguard": { "queries": "Queries", From 7ca6f36125e1445fa693e79f49c6d4688e4ccf00 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:57 +0000 Subject: [PATCH 071/207] Translated using Weblate (Dutch) Currently translated at 51.8% (241 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/ --- public/locales/nl/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json index 410f40dd..2afed425 100644 --- a/public/locales/nl/common.json +++ b/public/locales/nl/common.json @@ -176,7 +176,8 @@ }, "lidarr": { "wanted": "Gezocht", - "queued": "In de wachtrij" + "queued": "In de wachtrij", + "artists": "Artists" }, "adguard": { "queries": "Queries", From b72d894a30e04d795842ba2b08f1f896bda6b30c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:59 +0000 Subject: [PATCH 072/207] Translated using Weblate (Chinese (Traditional)) Currently translated at 98.9% (460 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/ --- public/locales/zh-Hant/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json index 59886f94..75aff10e 100644 --- a/public/locales/zh-Hant/common.json +++ b/public/locales/zh-Hant/common.json @@ -176,7 +176,8 @@ }, "lidarr": { "wanted": "關注中", - "queued": "已加入佇列" + "queued": "已加入佇列", + "artists": "Artists" }, "adguard": { "queries": "查詢", From fd74618b8f84914c8b48227d436b6dcec8b5803f Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:57 +0000 Subject: [PATCH 073/207] Translated using Weblate (Catalan) Currently translated at 55.9% (260 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/ --- public/locales/ca/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json index 399a9649..41391cd5 100644 --- a/public/locales/ca/common.json +++ b/public/locales/ca/common.json @@ -176,7 +176,8 @@ }, "lidarr": { "wanted": "Volgut", - "queued": "En cua" + "queued": "En cua", + "artists": "Artists" }, "adguard": { "queries": "Consultes", From 10cfe20e8aed74272dd9edacf66603029ca195b3 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:54 +0000 Subject: [PATCH 074/207] Translated using Weblate (Polish) Currently translated at 80.4% (374 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/ --- public/locales/pl/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index 7413c2ba..d43f9859 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -124,7 +124,8 @@ }, "lidarr": { "wanted": "Poszukiwane", - "queued": "W kolejce" + "queued": "W kolejce", + "artists": "Artists" }, "readarr": { "wanted": "Poszukiwane", From e03c891703fc61f3be6c4580d56462d9c3454af3 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:58 +0000 Subject: [PATCH 075/207] Translated using Weblate (Swedish) Currently translated at 27.9% (130 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/ --- public/locales/sv/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json index 3861157d..962a57be 100644 --- a/public/locales/sv/common.json +++ b/public/locales/sv/common.json @@ -102,7 +102,8 @@ }, "lidarr": { "wanted": "Eftersöker", - "queued": "I kö" + "queued": "I kö", + "artists": "Artists" }, "readarr": { "wanted": "Eftersökt", From e9722e89466ebac3fef5cb85cd706384570df6c9 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:58 +0000 Subject: [PATCH 076/207] Translated using Weblate (Croatian) Currently translated at 98.4% (458 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/ --- public/locales/hr/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json index 48a8df02..9a05a55c 100644 --- a/public/locales/hr/common.json +++ b/public/locales/hr/common.json @@ -139,7 +139,8 @@ }, "lidarr": { "wanted": "Zatraženo", - "queued": "U redu čekanja" + "queued": "U redu čekanja", + "artists": "Artists" }, "readarr": { "wanted": "Zatraženo", From 7d51a9b10c047923b8c6a77aa30a694039bfb6bf Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:00 +0000 Subject: [PATCH 077/207] Translated using Weblate (Hungarian) Currently translated at 23.0% (107 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/ --- public/locales/hu/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json index 2164d696..a8218e73 100644 --- a/public/locales/hu/common.json +++ b/public/locales/hu/common.json @@ -32,7 +32,8 @@ }, "lidarr": { "wanted": "Keresett", - "queued": "Sorban áll" + "queued": "Sorban áll", + "artists": "Artists" }, "readarr": { "wanted": "Keresett", From 4c4da54d9940923cc46e6b67ed62c7173abc3049 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:00 +0000 Subject: [PATCH 078/207] Translated using Weblate (Hebrew) Currently translated at 21.5% (100 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/ --- public/locales/he/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/he/common.json b/public/locales/he/common.json index ceed0eea..dfe2cb84 100644 --- a/public/locales/he/common.json +++ b/public/locales/he/common.json @@ -108,7 +108,8 @@ }, "lidarr": { "wanted": "מבוקש", - "queued": "בתור" + "queued": "בתור", + "artists": "Artists" }, "readarr": { "wanted": "מבוקש", From 1f9ee368c60c8937942dea75211f9a62482fdd5b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:59 +0000 Subject: [PATCH 079/207] Translated using Weblate (Romanian) Currently translated at 32.2% (150 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/ --- public/locales/ro/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json index 6bfc767c..3ca5004e 100644 --- a/public/locales/ro/common.json +++ b/public/locales/ro/common.json @@ -148,7 +148,8 @@ }, "lidarr": { "wanted": "Dorite", - "queued": "În coadă" + "queued": "În coadă", + "artists": "Artists" }, "readarr": { "wanted": "Dorite", From ac99f651883569278dd17984cccbce4734085153 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:59 +0000 Subject: [PATCH 080/207] Translated using Weblate (Portuguese (Brazil)) Currently translated at 86.8% (404 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/ --- public/locales/pt-BR/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json index fbd72df2..716ac875 100644 --- a/public/locales/pt-BR/common.json +++ b/public/locales/pt-BR/common.json @@ -126,7 +126,8 @@ }, "lidarr": { "wanted": "Desejado", - "queued": "Na fila" + "queued": "Na fila", + "artists": "Artists" }, "readarr": { "wanted": "Desejado", From aacc2fae9d70604d7434fa88010ec4adc44ebd1b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:03 +0000 Subject: [PATCH 081/207] Translated using Weblate (Yue (Traditional)) Currently translated at 25.1% (117 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/ --- public/locales/yue/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json index e3a508c3..73e5998b 100644 --- a/public/locales/yue/common.json +++ b/public/locales/yue/common.json @@ -108,7 +108,8 @@ }, "lidarr": { "wanted": "想睇", - "queued": "排緊隊" + "queued": "排緊隊", + "artists": "Artists" }, "readarr": { "wanted": "想睇", From 193582c8ae2b597db8f8f93ccee308b21f778347 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:02 +0000 Subject: [PATCH 082/207] Translated using Weblate (Finnish) Currently translated at 38.0% (177 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/ --- public/locales/fi/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json index 0dddbbce..f403b6d4 100644 --- a/public/locales/fi/common.json +++ b/public/locales/fi/common.json @@ -108,7 +108,8 @@ }, "lidarr": { "wanted": "Haluttu", - "queued": "Jonossa" + "queued": "Jonossa", + "artists": "Artists" }, "readarr": { "wanted": "Haluttu", From 1097a466698f16a361811766cede3ab48b65d467 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:02 +0000 Subject: [PATCH 083/207] Translated using Weblate (Telugu) Currently translated at 46.2% (215 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/ --- public/locales/te/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/te/common.json b/public/locales/te/common.json index c9b6c7d8..3d0deb15 100644 --- a/public/locales/te/common.json +++ b/public/locales/te/common.json @@ -125,7 +125,8 @@ }, "lidarr": { "wanted": "కావలెను", - "queued": "క్యూయూఎడ్" + "queued": "క్యూయూఎడ్", + "artists": "Artists" }, "bazarr": { "missingEpisodes": "ఎపిసోడ్‌లు లేవు", From 6794fa1429d807c98a50cc9af5540580b9acd1e2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:03 +0000 Subject: [PATCH 084/207] Translated using Weblate (Bulgarian) Currently translated at 9.8% (46 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/ --- public/locales/bg/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json index 7b96b3d0..bb6bacbb 100644 --- a/public/locales/bg/common.json +++ b/public/locales/bg/common.json @@ -131,7 +131,8 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued" + "queued": "Queued", + "artists": "Artists" }, "readarr": { "wanted": "Wanted", From 7fc313cc733f9e0fa1325a0ae6c20ffa24dd2b90 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:03 +0000 Subject: [PATCH 085/207] Translated using Weblate (Turkish) Currently translated at 84.5% (393 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/ --- public/locales/tr/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index 198860f4..09639f67 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -131,7 +131,8 @@ }, "lidarr": { "wanted": "Aranan", - "queued": "Kuyrukta" + "queued": "Kuyrukta", + "artists": "Artists" }, "readarr": { "wanted": "Aranan", From 36717ede616a513cd9adbdf57445284fa3901bfd Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:59 +0000 Subject: [PATCH 086/207] Translated using Weblate (Serbian) Currently translated at 1.9% (9 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/ --- public/locales/sr/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json index 2a2971b2..8ce72d5c 100644 --- a/public/locales/sr/common.json +++ b/public/locales/sr/common.json @@ -131,7 +131,8 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued" + "queued": "Queued", + "artists": "Artists" }, "readarr": { "wanted": "Wanted", From 1ca12714e08f89cbbd0664feb5fac414eff64718 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:00 +0000 Subject: [PATCH 087/207] Translated using Weblate (Arabic) Currently translated at 55.9% (260 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/ --- public/locales/ar/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json index 7562e8ea..7f118dc1 100644 --- a/public/locales/ar/common.json +++ b/public/locales/ar/common.json @@ -193,7 +193,8 @@ }, "lidarr": { "wanted": "مطلوب", - "queued": "في الإنتظار" + "queued": "في الإنتظار", + "artists": "Artists" }, "readarr": { "wanted": "مطلوب", From fabb65995ce221f0faf1515e3e2318a70f13545b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:55 +0000 Subject: [PATCH 088/207] Translated using Weblate (Czech) Currently translated at 95.4% (444 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/ --- public/locales/cs/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json index e38cc629..940ec67e 100644 --- a/public/locales/cs/common.json +++ b/public/locales/cs/common.json @@ -147,7 +147,8 @@ }, "lidarr": { "wanted": "Hledané", - "queued": "Ve frontě" + "queued": "Ve frontě", + "artists": "Artists" }, "readarr": { "wanted": "Hledané", From bfb326bd73aee3dd2e4eb22e2902a871a79644c1 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:54 +0000 Subject: [PATCH 089/207] Translated using Weblate (Danish) Currently translated at 42.3% (197 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/ --- public/locales/da/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/da/common.json b/public/locales/da/common.json index 7f4ceffd..d1c41aaa 100644 --- a/public/locales/da/common.json +++ b/public/locales/da/common.json @@ -15,7 +15,8 @@ }, "lidarr": { "wanted": "Ønsket", - "queued": "I Kø" + "queued": "I Kø", + "artists": "Artists" }, "jellyseerr": { "available": "Tilgængelig", From 2493e608e88a6cb2b9c733a23235470ea87a8516 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:54 +0000 Subject: [PATCH 090/207] Translated using Weblate (Malay) Currently translated at 53.9% (251 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/ --- public/locales/ms/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json index d57b2805..e249cf43 100644 --- a/public/locales/ms/common.json +++ b/public/locales/ms/common.json @@ -33,7 +33,8 @@ }, "lidarr": { "queued": "Dibaris Gilir", - "wanted": "Mahu" + "wanted": "Mahu", + "artists": "Artists" }, "readarr": { "wanted": "Mahu", From c29e351afcb5b7495022cfd2f79bf4292fd1eb75 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:55 +0000 Subject: [PATCH 091/207] Translated using Weblate (Hindi) Currently translated at 1.9% (9 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/ --- public/locales/hi/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json index 10488f5d..623775c2 100644 --- a/public/locales/hi/common.json +++ b/public/locales/hi/common.json @@ -169,7 +169,8 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued" + "queued": "Queued", + "artists": "Artists" }, "overseerr": { "pending": "Pending", From 1dea651d8b19acf916fb1aca70fb24fce74acc87 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:55 +0000 Subject: [PATCH 092/207] Translated using Weblate (Esperanto) Currently translated at 31.1% (145 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/ --- public/locales/eo/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json index c489979d..4ed593be 100644 --- a/public/locales/eo/common.json +++ b/public/locales/eo/common.json @@ -145,7 +145,8 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued" + "queued": "Queued", + "artists": "Artists" }, "readarr": { "wanted": "Wanted", From 678819d0652387c3b0e4b488ec5f1b6658296adb Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:56 +0000 Subject: [PATCH 093/207] Translated using Weblate (Ukrainian) Currently translated at 99.7% (464 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/ --- public/locales/uk/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index 6f6a4c11..6b112e8f 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -246,7 +246,8 @@ }, "lidarr": { "wanted": "Розшукується", - "queued": "У черзі" + "queued": "У черзі", + "artists": "Artists" }, "traefik": { "middleware": "Проміжне програмне забезпечення", From 4382bab64b91cbea6b1cc3457e864e30096b305c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:55 +0000 Subject: [PATCH 094/207] Translated using Weblate (Japanese) Currently translated at 80.2% (373 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/ --- public/locales/ja/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index 8625cb15..ec9b82a9 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -207,7 +207,8 @@ }, "lidarr": { "wanted": "募集中", - "queued": "キュー" + "queued": "キュー", + "artists": "Artists" }, "readarr": { "wanted": "募集中", From b5c4e36a5303d46c6e8301a8a4827bd4cf27969d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:56 +0000 Subject: [PATCH 095/207] Translated using Weblate (Latvian) Currently translated at 25.3% (118 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/ --- public/locales/lv/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/lv/common.json b/public/locales/lv/common.json index e38f8671..d8d63388 100644 --- a/public/locales/lv/common.json +++ b/public/locales/lv/common.json @@ -168,7 +168,8 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued" + "queued": "Queued", + "artists": "Artists" }, "readarr": { "wanted": "Wanted", From d06d6f7e44aa3806730e707020996d3416ade2e2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:53 +0000 Subject: [PATCH 096/207] Translated using Weblate (Thai) Currently translated at 10.1% (47 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/ --- public/locales/th/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/th/common.json b/public/locales/th/common.json index d0ec6c6b..3981f0f8 100644 --- a/public/locales/th/common.json +++ b/public/locales/th/common.json @@ -224,7 +224,8 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued" + "queued": "Queued", + "artists": "Artists" }, "ombi": { "pending": "Pending", From 19bcf40d313409f0a71593d9595b0b15dab810ed Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:01 +0000 Subject: [PATCH 097/207] Translated using Weblate (Slovak) Currently translated at 1.9% (9 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/ --- public/locales/sk/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index 6a294895..ee08f212 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -287,7 +287,8 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued" + "queued": "Queued", + "artists": "Artists" }, "readarr": { "wanted": "Wanted", From ee5fa003ee8913c5432159c7a5432f406a04bd3d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:17:01 +0000 Subject: [PATCH 098/207] Translated using Weblate (Korean) Currently translated at 37.2% (173 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/ --- public/locales/ko/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json index 26e8475b..6a58072f 100644 --- a/public/locales/ko/common.json +++ b/public/locales/ko/common.json @@ -177,7 +177,8 @@ }, "lidarr": { "wanted": "요청", - "queued": "대기 중" + "queued": "대기 중", + "artists": "Artists" }, "readarr": { "wanted": "요청", From fe647fe67a9a8cbafae346bc046777b10a61824d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:53 +0000 Subject: [PATCH 099/207] Translated using Weblate (Greek) Currently translated at 30.7% (143 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/ --- public/locales/el/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/el/common.json b/public/locales/el/common.json index a2eb9ac5..3492bdd1 100644 --- a/public/locales/el/common.json +++ b/public/locales/el/common.json @@ -226,7 +226,8 @@ }, "lidarr": { "wanted": "Θέλετε", - "queued": "Στη σειρά" + "queued": "Στη σειρά", + "artists": "Artists" }, "readarr": { "wanted": "Θέλετε", From 0be0fa71d372957f3dbd5cd7d8fd6d1f60857c3b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:56 +0000 Subject: [PATCH 100/207] Translated using Weblate (Slovenian) Currently translated at 96.5% (449 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/ --- public/locales/sl/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/sl/common.json b/public/locales/sl/common.json index 49be2e8a..fe5fe631 100644 --- a/public/locales/sl/common.json +++ b/public/locales/sl/common.json @@ -249,7 +249,8 @@ }, "lidarr": { "wanted": "Iskano", - "queued": "V vrsti" + "queued": "V vrsti", + "artists": "Artists" }, "readarr": { "wanted": "Iskano", From b882065d5ee0e0533dd0aa216cb6c2ecf0bf9f0a Mon Sep 17 00:00:00 2001 From: Anonymous Date: Thu, 8 Jun 2023 14:16:54 +0000 Subject: [PATCH 101/207] Translated using Weblate (Indonesian) Currently translated at 3.2% (15 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/ --- public/locales/id/common.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/locales/id/common.json b/public/locales/id/common.json index eb63e939..d54218c4 100644 --- a/public/locales/id/common.json +++ b/public/locales/id/common.json @@ -69,7 +69,8 @@ }, "lidarr": { "wanted": "Wanted", - "queued": "Queued" + "queued": "Queued", + "artists": "Artists" }, "readarr": { "wanted": "Wanted", From 2da66b504b1018be353be10cd6a67d3dc1b28067 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 8 Jun 2023 07:17:58 -0700 Subject: [PATCH 102/207] lint lidarr widget.js --- src/widgets/lidarr/widget.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/widgets/lidarr/widget.js b/src/widgets/lidarr/widget.js index 55975e63..2f036726 100644 --- a/src/widgets/lidarr/widget.js +++ b/src/widgets/lidarr/widget.js @@ -1,5 +1,4 @@ import genericProxyHandler from "utils/proxy/handlers/generic"; -import { jsonArrayFilter } from "utils/proxy/api-helpers"; const widget = { api: "{url}/api/v1/{endpoint}?apikey={key}", From 0101e8ccb950cbae2fb9e1a3310fdf5e387894ac Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 8 Jun 2023 09:40:20 -0700 Subject: [PATCH 103/207] make portainer error detection more specific --- src/widgets/portainer/component.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widgets/portainer/component.jsx b/src/widgets/portainer/component.jsx index 7da289c4..53a6fd26 100644 --- a/src/widgets/portainer/component.jsx +++ b/src/widgets/portainer/component.jsx @@ -23,8 +23,8 @@ export default function Component({ service }) { ); } - if (containersData.error || !Array.isArray(containersData)) { - // containersData can be itself an error object + if (containersData.error || containersData.message) { + // containersData can be itself an error object e.g. if environment fails return ; } From 68b6192d8c38f2961f11bd9dea9e8f1b99e323c3 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 9 Jun 2023 09:01:19 -0700 Subject: [PATCH 104/207] Fix full height layout on tall screens --- src/pages/index.jsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 06e55010..e170d4e1 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -252,7 +252,7 @@ function Home({ initialSettings }) { /> -
    +
    )} -
    - {!initialSettings?.color && } - - {!initialSettings?.theme && } -
    +
    +
    + {!initialSettings?.color && } + + {!initialSettings?.theme && } +
    -
    - {!initialSettings?.hideVersion && } +
    + {!initialSettings?.hideVersion && } +
    From 6b2930ab8d52c70cf6a1dd8bb85fcd5d86b17233 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sat, 10 Jun 2023 23:30:44 -0700 Subject: [PATCH 105/207] Revert "Added optional boxed styling for information widgets and refactored information widgets" --- src/components/widgets/datetime/datetime.jsx | 21 +- src/components/widgets/glances/glances.jsx | 262 ++++++++++++------ src/components/widgets/greeting/greeting.jsx | 11 +- .../widgets/kubernetes/kubernetes.jsx | 38 ++- src/components/widgets/kubernetes/node.jsx | 11 +- .../widgets/kubernetes/usage-bar.jsx | 12 + src/components/widgets/logo/logo.jsx | 11 +- src/components/widgets/longhorn/longhorn.jsx | 32 ++- src/components/widgets/longhorn/node.jsx | 38 ++- .../widgets/openmeteo/openmeteo.jsx | 103 ++++--- .../widgets/openweathermap/weather.jsx | 99 +++++-- src/components/widgets/resources/cpu.jsx | 82 ++++-- src/components/widgets/resources/cputemp.jsx | 90 ++++-- src/components/widgets/resources/disk.jsx | 67 +++-- src/components/widgets/resources/memory.jsx | 75 +++-- .../widgets/resources/resources.jsx | 11 +- src/components/widgets/resources/uptime.jsx | 44 ++- src/components/widgets/search/search.jsx | 162 ++++++----- .../widgets/unifi_console/unifi_console.jsx | 45 +-- src/components/widgets/weather/weather.jsx | 104 ++++--- src/components/widgets/widget.jsx | 4 +- src/components/widgets/widget/container.jsx | 42 --- .../widgets/widget/container_button.jsx | 10 - .../widgets/widget/container_form.jsx | 10 - .../widgets/widget/container_link.jsx | 10 - src/components/widgets/widget/error.jsx | 15 - .../widgets/widget/primary_text.jsx | 5 - src/components/widgets/widget/raw.jsx | 7 - src/components/widgets/widget/resource.jsx | 22 -- src/components/widgets/widget/resources.jsx | 15 - .../widgets/widget/secondary_text.jsx | 5 - src/components/widgets/widget/widget_icon.jsx | 18 -- .../widgets/widget/widget_label.jsx | 3 - src/pages/api/widgets/longhorn.js | 2 +- src/pages/index.jsx | 10 +- 35 files changed, 854 insertions(+), 642 deletions(-) create mode 100644 src/components/widgets/kubernetes/usage-bar.jsx delete mode 100644 src/components/widgets/widget/container.jsx delete mode 100644 src/components/widgets/widget/container_button.jsx delete mode 100644 src/components/widgets/widget/container_form.jsx delete mode 100644 src/components/widgets/widget/container_link.jsx delete mode 100644 src/components/widgets/widget/error.jsx delete mode 100644 src/components/widgets/widget/primary_text.jsx delete mode 100644 src/components/widgets/widget/raw.jsx delete mode 100644 src/components/widgets/widget/resource.jsx delete mode 100644 src/components/widgets/widget/resources.jsx delete mode 100644 src/components/widgets/widget/secondary_text.jsx delete mode 100644 src/components/widgets/widget/widget_icon.jsx delete mode 100644 src/components/widgets/widget/widget_label.jsx diff --git a/src/components/widgets/datetime/datetime.jsx b/src/components/widgets/datetime/datetime.jsx index 454d004d..86983473 100644 --- a/src/components/widgets/datetime/datetime.jsx +++ b/src/components/widgets/datetime/datetime.jsx @@ -1,9 +1,6 @@ import { useState, useEffect } from "react"; import { useTranslation } from "next-i18next"; -import Container from "../widget/container"; -import Raw from "../widget/raw"; - const textSizes = { "4xl": "text-4xl", "3xl": "text-3xl", @@ -20,7 +17,7 @@ export default function DateTime({ options }) { const { i18n } = useTranslation(); const [date, setDate] = useState(""); const dateLocale = locale ?? i18n.language; - + useEffect(() => { const dateFormat = new Intl.DateTimeFormat(dateLocale, { ...format }); const interval = setInterval(() => { @@ -30,14 +27,12 @@ export default function DateTime({ options }) { }, [date, setDate, dateLocale, format]); return ( - - -
    - - {date} - -
    -
    -
    +
    +
    + + {date} + +
    +
    ); } diff --git a/src/components/widgets/glances/glances.jsx b/src/components/widgets/glances/glances.jsx index b45dfefe..85dd44c0 100644 --- a/src/components/widgets/glances/glances.jsx +++ b/src/components/widgets/glances/glances.jsx @@ -1,13 +1,11 @@ import useSWR from "swr"; import { useContext } from "react"; +import { BiError } from "react-icons/bi"; import { FaMemory, FaRegClock, FaThermometerHalf } from "react-icons/fa"; import { FiCpu, FiHardDrive } from "react-icons/fi"; import { useTranslation } from "next-i18next"; -import Error from "../widget/error"; -import Resource from "../widget/resource"; -import Resources from "../widget/resources"; -import WidgetLabel from "../widget/widget_label"; +import UsageBar from "../resources/usage-bar"; import { SettingsContext } from "utils/contexts/settings"; @@ -28,17 +26,52 @@ export default function Widget({ options }) { ); if (error || data?.error) { - return + return ( +
    +
    +
    + +
    + {t("widget.api_error")} +
    +
    +
    +
    + ); } if (!data) { - return - - - { options.cputemp && } - { options.uptime && } - { options.label && } - ; + return ( +
    +
    +
    + +
    +
    +
    + {t("glances.wait")} +
    +
    + +
    +
    +
    + +
    +
    +
    + {t("glances.wait")} +
    +
    + +
    +
    +
    + {options.label && ( +
    {options.label}
    + )} +
    + ); } const unit = options.units === "imperial" ? "fahrenheit" : "celsius"; @@ -68,84 +101,131 @@ export default function Widget({ options }) { } return ( - - - - {disks.map((disk) => ( - - ))} - {options.cputemp && mainTemp > 0 && - - } - {options.uptime && data.uptime && - - } - {options.label && } - + +
    +
    + +
    +
    +
    + {t("common.number", { + value: data.cpu.total, + style: "unit", + unit: "percent", + maximumFractionDigits: 0, + })} +
    +
    {t("glances.cpu")}
    +
    + {options.expanded && ( + +
    + {t("common.number", { + value: data.load.min15, + style: "unit", + unit: "percent", + maximumFractionDigits: 0, + })} +
    +
    {t("glances.load")}
    +
    + )} + +
    +
    +
    + +
    +
    +
    + {t("common.bytes", { + value: data.mem.free, + maximumFractionDigits: 1, + binary: true, + })} +
    +
    {t("glances.free")}
    +
    + {options.expanded && ( + +
    + {t("common.bytes", { + value: data.mem.total, + maximumFractionDigits: 1, + binary: true, + })} +
    +
    {t("glances.total")}
    +
    + )} + +
    +
    + {disks.map((disk) => ( +
    + +
    + +
    {t("common.bytes", { value: disk.free })}
    +
    {t("glances.free")}
    +
    + {options.expanded && ( + +
    {t("common.bytes", { value: disk.size })}
    +
    {t("glances.total")}
    +
    + )} + +
    +
    ))} + {options.cputemp && mainTemp > 0 && + (
    + +
    + +
    + {t("common.number", { + value: mainTemp, + maximumFractionDigits: 1, + style: "unit", + unit + })} +
    +
    {t("glances.temp")}
    +
    + {options.expanded && ( + +
    + {t("common.number", { + value: maxTemp, + maximumFractionDigits: 1, + style: "unit", + unit + })} +
    +
    {t("glances.warn")}
    +
    + )} + +
    +
    )} + {options.uptime && data.uptime && + (
    + +
    + +
    + {data.uptime.replace(" days,", t("glances.days")).replace(/:\d\d:\d\d$/g, t("glances.hours"))} +
    +
    {t("glances.uptime")}
    +
    + +
    +
    )} +
    + {options.label && ( +
    {options.label}
    + )} +
    ); } diff --git a/src/components/widgets/greeting/greeting.jsx b/src/components/widgets/greeting/greeting.jsx index 11de571c..da0f063d 100644 --- a/src/components/widgets/greeting/greeting.jsx +++ b/src/components/widgets/greeting/greeting.jsx @@ -1,6 +1,3 @@ -import Container from "../widget/container"; -import Raw from "../widget/raw"; - const textSizes = { "4xl": "text-4xl", "3xl": "text-3xl", @@ -14,12 +11,12 @@ const textSizes = { export default function Greeting({ options }) { if (options.text) { - return - + return ( +
    {options.text} - - ; +
    + ); } } diff --git a/src/components/widgets/kubernetes/kubernetes.jsx b/src/components/widgets/kubernetes/kubernetes.jsx index 2d1f55e4..78c4caaf 100644 --- a/src/components/widgets/kubernetes/kubernetes.jsx +++ b/src/components/widgets/kubernetes/kubernetes.jsx @@ -1,15 +1,12 @@ import useSWR from "swr"; +import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; -import Error from "../widget/error"; -import Container from "../widget/container"; -import Raw from "../widget/raw"; - import Node from "./node"; export default function Widget({ options }) { const { cluster, nodes } = options; - const { i18n } = useTranslation(); + const { t, i18n } = useTranslation(); const defaultData = { cpu: { @@ -21,7 +18,7 @@ export default function Widget({ options }) { used: 0, total: 0, free: 0, - percent: 0 + precent: 0 } }; @@ -32,12 +29,23 @@ export default function Widget({ options }) { ); if (error || data?.error) { - return + return ( +
    +
    +
    + +
    + {t("widget.api_error")} +
    +
    +
    +
    + ); } if (!data) { - return - + return ( +
    {cluster.show && @@ -46,12 +54,12 @@ export default function Widget({ options }) { }
    - - ; +
    + ); } - return - + return ( +
    {cluster.show && @@ -61,6 +69,6 @@ export default function Widget({ options }) { ) }
    - - ; +
    + ); } diff --git a/src/components/widgets/kubernetes/node.jsx b/src/components/widgets/kubernetes/node.jsx index cc864be6..7a7c322d 100644 --- a/src/components/widgets/kubernetes/node.jsx +++ b/src/components/widgets/kubernetes/node.jsx @@ -3,7 +3,8 @@ import { FiAlertTriangle, FiCpu, FiServer } from "react-icons/fi"; import { SiKubernetes } from "react-icons/si"; import { useTranslation } from "next-i18next"; -import UsageBar from "../resources/usage-bar"; +import UsageBar from "./usage-bar"; + export default function Node({ type, options, data }) { const { t } = useTranslation(); @@ -28,7 +29,7 @@ export default function Node({ type, options, data }) {
    {t("common.number", { - value: data?.cpu?.percent ?? 0, + value: data.cpu.percent, style: "unit", unit: "percent", maximumFractionDigits: 0 @@ -36,18 +37,18 @@ export default function Node({ type, options, data }) {
    - +
    {t("common.bytes", { - value: data?.memory?.free ?? 0, + value: data.memory.free, maximumFractionDigits: 0, binary: true })}
    - + {options.showLabel && (
    {type === "cluster" ? options.label : data.name}
    )} diff --git a/src/components/widgets/kubernetes/usage-bar.jsx b/src/components/widgets/kubernetes/usage-bar.jsx new file mode 100644 index 00000000..c817db4c --- /dev/null +++ b/src/components/widgets/kubernetes/usage-bar.jsx @@ -0,0 +1,12 @@ +export default function UsageBar({ percent }) { + return ( +
    +
    +
    + ); +} diff --git a/src/components/widgets/logo/logo.jsx b/src/components/widgets/logo/logo.jsx index 3a4a2565..96e8569f 100644 --- a/src/components/widgets/logo/logo.jsx +++ b/src/components/widgets/logo/logo.jsx @@ -1,13 +1,9 @@ -import Container from "../widget/container"; -import Raw from "../widget/raw"; - import ResolvedIcon from "components/resolvedicon" export default function Logo({ options }) { return ( - - - {options.icon ? +
    + {options.icon ? : // fallback to homepage logo } - - +
    ) } diff --git a/src/components/widgets/longhorn/longhorn.jsx b/src/components/widgets/longhorn/longhorn.jsx index c0169ceb..9fcb21b4 100644 --- a/src/components/widgets/longhorn/longhorn.jsx +++ b/src/components/widgets/longhorn/longhorn.jsx @@ -1,31 +1,37 @@ import useSWR from "swr"; - -import Error from "../widget/error"; -import Container from "../widget/container"; -import Raw from "../widget/raw"; +import { BiError } from "react-icons/bi"; +import { useTranslation } from "next-i18next"; import Node from "./node"; export default function Longhorn({ options }) { const { expanded, total, labels, include, nodes } = options; + const { t } = useTranslation(); const { data, error } = useSWR(`/api/widgets/longhorn`, { refreshInterval: 1500 }); if (error || data?.error) { - return + return ( +
    + +
    + {t("widget.api_error")} +
    +
    + ); } if (!data) { - return - + return ( +
    - - ; +
    + ); } - return - + return ( +
    {data.nodes .filter((node) => { @@ -46,6 +52,6 @@ export default function Longhorn({ options }) {
    )}
    -
    -
    ; +
    + ); } diff --git a/src/components/widgets/longhorn/node.jsx b/src/components/widgets/longhorn/node.jsx index 5235698a..e0ee69af 100644 --- a/src/components/widgets/longhorn/node.jsx +++ b/src/components/widgets/longhorn/node.jsx @@ -1,20 +1,32 @@ +import { FiHardDrive } from "react-icons/fi"; import { useTranslation } from "next-i18next"; -import { FaThermometerHalf } from "react-icons/fa"; -import Resource from "../widget/resource"; -import WidgetLabel from "../widget/widget_label"; +import UsageBar from "../resources/usage-bar"; export default function Node({ data, expanded, labels }) { const { t } = useTranslation(); - return { labels && } - + return ( + <> +
    + +
    + +
    {t("common.bytes", { value: data.node.available })}
    +
    {t("resources.free")}
    +
    + {expanded && ( + +
    {t("common.bytes", { value: data.node.maximum })}
    +
    {t("resources.total")}
    +
    + )} + +
    +
    + {labels && ( +
    {data.node.id}
    + )} + + ); } diff --git a/src/components/widgets/openmeteo/openmeteo.jsx b/src/components/widgets/openmeteo/openmeteo.jsx index 040a3b6b..0d29aef5 100644 --- a/src/components/widgets/openmeteo/openmeteo.jsx +++ b/src/components/widgets/openmeteo/openmeteo.jsx @@ -1,16 +1,10 @@ import useSWR from "swr"; import { useState } from "react"; +import { BiError } from "react-icons/bi"; import { WiCloudDown } from "react-icons/wi"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { useTranslation } from "next-i18next"; -import Error from "../widget/error"; -import Container from "../widget/container"; -import ContainerButton from "../widget/container_button"; -import WidgetIcon from "../widget/widget_icon"; -import PrimaryText from "../widget/primary_text"; -import SecondaryText from "../widget/secondary_text"; - import Icon from "./icon"; function Widget({ options }) { @@ -21,35 +15,60 @@ function Widget({ options }) { ); if (error || data?.error) { - return + return ( +
    +
    +
    + +
    + {t("widget.api_error")} + - +
    +
    +
    +
    + ); } if (!data) { - return - {t("weather.updating")} - {t("weather.wait")} - - ; + return ( +
    +
    +
    + +
    +
    + {t("weather.updating")} + {t("weather.wait")} +
    +
    +
    + ); } const unit = options.units === "metric" ? "celsius" : "fahrenheit"; - const weatherInfo = { - condition: data.current_weather.weathercode, - timeOfDay: data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night" - }; + const timeOfDay = data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night"; - return - - {options.label && `${options.label}, `} - {t("common.number", { - value: data.current_weather.temperature, - style: "unit", - unit, - })} - - {t(`wmo.${data.current_weather.weathercode}-${weatherInfo.timeOfDay}`)} - - ; + return ( +
    +
    +
    + +
    +
    + + {options.label && `${options.label}, `} + {t("common.number", { + value: data.current_weather.temperature, + style: "unit", + unit, + })} + + {t(`wmo.${data.current_weather.weathercode}-${timeOfDay}`)} +
    +
    +
    + ); } export default function OpenMeteo({ options }) { @@ -84,11 +103,27 @@ export default function OpenMeteo({ options }) { // if (!requesting && !location) requestLocation(); if (!location) { - return - {t("weather.current")} - {t("weather.allow")} - - ; + return ( + + ); } return ; diff --git a/src/components/widgets/openweathermap/weather.jsx b/src/components/widgets/openweathermap/weather.jsx index 30531513..49f428a0 100644 --- a/src/components/widgets/openweathermap/weather.jsx +++ b/src/components/widgets/openweathermap/weather.jsx @@ -1,19 +1,12 @@ import useSWR from "swr"; import { useState } from "react"; +import { BiError } from "react-icons/bi"; import { WiCloudDown } from "react-icons/wi"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { useTranslation } from "next-i18next"; -import Error from "../widget/error"; -import Container from "../widget/container"; -import ContainerButton from "../widget/container_button"; -import PrimaryText from "../widget/primary_text"; -import SecondaryText from "../widget/secondary_text"; -import WidgetIcon from "../widget/widget_icon"; - import Icon from "./icon"; - function Widget({ options }) { const { t, i18n } = useTranslation(); @@ -22,30 +15,58 @@ function Widget({ options }) { ); if (error || data?.cod === 401 || data?.error) { - return + return ( +
    +
    +
    + +
    + {t("widget.api_error")} + - +
    +
    +
    +
    + ); } if (!data) { - return - {t("weather.updating")} - {t("weather.wait")} - - ; + return ( +
    +
    +
    + +
    +
    + {t("weather.updating")} + {t("weather.wait")} +
    +
    +
    + ); } const unit = options.units === "metric" ? "celsius" : "fahrenheit"; - const weatherInfo = { - condition: data.weather[0].id, - timeOfDay: data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night" - }; - - return - {options.label && `${options.label}, `} - {t("common.number", { value: data.main.temp, style: "unit", unit })} - {data.weather[0].description} - - ; + return ( +
    +
    +
    + data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night"} + /> +
    +
    + + {options.label && `${options.label}, `} + {t("common.number", { value: data.main.temp, style: "unit", unit })} + + {data.weather[0].description} +
    +
    +
    + ); } export default function OpenWeatherMap({ options }) { @@ -77,12 +98,30 @@ export default function OpenWeatherMap({ options }) { } }; + // if (!requesting && !location) requestLocation(); + if (!location) { - return - {t("weather.current")} - {t("weather.allow")} - - ; + return ( + + ); } return ; diff --git a/src/components/widgets/resources/cpu.jsx b/src/components/widgets/resources/cpu.jsx index 12972fe8..7069e3c4 100644 --- a/src/components/widgets/resources/cpu.jsx +++ b/src/components/widgets/resources/cpu.jsx @@ -1,9 +1,9 @@ import useSWR from "swr"; import { FiCpu } from "react-icons/fi"; +import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; -import Resource from "../widget/resource"; -import Error from "../widget/error"; +import UsageBar from "./usage-bar"; export default function Cpu({ expanded }) { const { t } = useTranslation(); @@ -13,29 +13,67 @@ export default function Cpu({ expanded }) { }); if (error || data?.error) { - return + return ( +
    + +
    + {t("widget.api_error")} +
    +
    + ); } if (!data) { - return + return ( +
    + +
    +
    +
    -
    +
    {t("resources.cpu")}
    +
    + {expanded && ( +
    +
    -
    +
    {t("resources.load")}
    +
    + )} + +
    +
    + ); } - return + const percent = data.cpu.usage; + + return ( +
    + +
    +
    +
    + {t("common.number", { + value: data.cpu.usage, + style: "unit", + unit: "percent", + maximumFractionDigits: 0, + })} +
    +
    {t("resources.cpu")}
    +
    + {expanded && ( +
    +
    + {t("common.number", { + value: data.cpu.load, + maximumFractionDigits: 2, + })} +
    +
    {t("resources.load")}
    +
    + )} + +
    +
    + ); } diff --git a/src/components/widgets/resources/cputemp.jsx b/src/components/widgets/resources/cputemp.jsx index ba6d9b73..571e6c8a 100644 --- a/src/components/widgets/resources/cputemp.jsx +++ b/src/components/widgets/resources/cputemp.jsx @@ -1,9 +1,9 @@ import useSWR from "swr"; import { FaThermometerHalf } from "react-icons/fa"; +import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; -import Resource from "../widget/resource"; -import Error from "../widget/error"; +import UsageBar from "./usage-bar"; function convertToFahrenheit(t) { return t * 9/5 + 32 @@ -17,18 +17,34 @@ export default function CpuTemp({ expanded, units }) { }); if (error || data?.error) { - return + return ( +
    + +
    + {t("widget.api_error")} +
    +
    + ); } if (!data || !data.cputemp) { - return ; + return ( +
    + +
    + +
    -
    +
    {t("resources.temp")}
    +
    + {expanded && ( + +
    -
    +
    {t("resources.max")}
    +
    + )} +
    +
    + ); } let mainTemp = data.cputemp.main; @@ -38,24 +54,38 @@ export default function CpuTemp({ expanded, units }) { const unit = units === "imperial" ? "fahrenheit" : "celsius"; mainTemp = (unit === "celsius") ? mainTemp : convertToFahrenheit(mainTemp); const maxTemp = (unit === "celsius") ? data.cputemp.max : convertToFahrenheit(data.cputemp.max); + const percent = Math.round((mainTemp / maxTemp) * 100); - return ; + return ( +
    + +
    + +
    + {t("common.number", { + value: mainTemp, + maximumFractionDigits: 1, + style: "unit", + unit + })} +
    +
    {t("resources.temp")}
    +
    + {expanded && ( + +
    + {t("common.number", { + value: maxTemp, + maximumFractionDigits: 1, + style: "unit", + unit + })} +
    +
    {t("resources.max")}
    +
    + )} + +
    +
    + ); } diff --git a/src/components/widgets/resources/disk.jsx b/src/components/widgets/resources/disk.jsx index ab56624d..ca09c095 100644 --- a/src/components/widgets/resources/disk.jsx +++ b/src/components/widgets/resources/disk.jsx @@ -1,9 +1,9 @@ import useSWR from "swr"; import { FiHardDrive } from "react-icons/fi"; +import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; -import Resource from "../widget/resource"; -import Error from "../widget/error"; +import UsageBar from "./usage-bar"; export default function Disk({ options, expanded }) { const { t } = useTranslation(); @@ -13,31 +13,56 @@ export default function Disk({ options, expanded }) { }); if (error || data?.error) { - return + return ( +
    + +
    + {t("widget.api_error")} +
    +
    + ); } if (!data) { - return ; + return ( +
    + +
    + +
    -
    +
    {t("resources.free")}
    +
    + {expanded && ( + +
    -
    +
    {t("resources.total")}
    +
    + )} + +
    +
    + ); } // data.drive.used not accurate? const percent = Math.round(((data.drive.size - data.drive.available) / data.drive.size) * 100); - return ; + return ( +
    + +
    + +
    {t("common.bytes", { value: data.drive.available })}
    +
    {t("resources.free")}
    +
    + {expanded && ( + +
    {t("common.bytes", { value: data.drive.size })}
    +
    {t("resources.total")}
    +
    + )} + +
    +
    + ); } diff --git a/src/components/widgets/resources/memory.jsx b/src/components/widgets/resources/memory.jsx index 19ae8687..30b7c8eb 100644 --- a/src/components/widgets/resources/memory.jsx +++ b/src/components/widgets/resources/memory.jsx @@ -1,9 +1,9 @@ import useSWR from "swr"; import { FaMemory } from "react-icons/fa"; +import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; -import Resource from "../widget/resource"; -import Error from "../widget/error"; +import UsageBar from "./usage-bar"; export default function Memory({ expanded }) { const { t } = useTranslation(); @@ -13,30 +13,63 @@ export default function Memory({ expanded }) { }); if (error || data?.error) { - return + return ( +
    + +
    + {t("widget.api_error")} +
    +
    + ); } if (!data) { - return ; + return ( +
    + +
    + +
    -
    +
    {t("resources.free")}
    +
    + {expanded && ( + +
    -
    +
    {t("resources.total")}
    +
    + )} + +
    +
    + ); } const percent = Math.round((data.memory.active / data.memory.total) * 100); - return ; + return ( +
    + +
    + +
    + {t("common.bytes", { value: data.memory.available, maximumFractionDigits: 1, binary: true })} +
    +
    {t("resources.free")}
    +
    + {expanded && ( + +
    + {t("common.bytes", { + value: data.memory.total, + maximumFractionDigits: 1, + binary: true, + })} +
    +
    {t("resources.total")}
    +
    + )} + +
    +
    + ); } diff --git a/src/components/widgets/resources/resources.jsx b/src/components/widgets/resources/resources.jsx index 0cc2c301..4ff0c81c 100644 --- a/src/components/widgets/resources/resources.jsx +++ b/src/components/widgets/resources/resources.jsx @@ -1,6 +1,3 @@ -import Container from "../widget/container"; -import Raw from "../widget/raw"; - import Disk from "./disk"; import Cpu from "./cpu"; import Memory from "./memory"; @@ -9,8 +6,8 @@ import Uptime from "./uptime"; export default function Resources({ options }) { const { expanded, units } = options; - return - + return ( +
    {options.cpu && } {options.memory && } @@ -23,6 +20,6 @@ export default function Resources({ options }) { {options.label && (
    {options.label}
    )} - - ; +
    + ); } diff --git a/src/components/widgets/resources/uptime.jsx b/src/components/widgets/resources/uptime.jsx index 3984975f..3bf785b1 100644 --- a/src/components/widgets/resources/uptime.jsx +++ b/src/components/widgets/resources/uptime.jsx @@ -1,9 +1,9 @@ import useSWR from "swr"; import { FaRegClock } from "react-icons/fa"; +import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; -import Resource from "../widget/resource"; -import Error from "../widget/error"; +import UsageBar from "./usage-bar"; export default function Uptime() { const { t } = useTranslation(); @@ -13,24 +13,54 @@ export default function Uptime() { }); if (error || data?.error) { - return + return ( +
    + +
    + {t("widget.api_error")} +
    +
    + ); } if (!data) { - return ; + return ( +
    + +
    + +
    -
    +
    {t("resources.temp")}
    +
    +
    +
    + ); } const mo = Math.floor(data.uptime / (3600 * 24 * 31)); const d = Math.floor(data.uptime % (3600 * 24 * 31) / (3600 * 24)); const h = Math.floor(data.uptime % (3600 * 24) / 3600); const m = Math.floor(data.uptime % 3600 / 60); - + let uptime; if (mo > 0) uptime = `${mo}${t("resources.months")} ${d}${t("resources.days")}`; else if (d > 0) uptime = `${d}${t("resources.days")} ${h}${t("resources.hours")}`; else uptime = `${h}${t("resources.hours")} ${m}${t("resources.minutes")}`; - const percent = Math.round((new Date().getSeconds() / 60) * 100).toString(); + const percent = Math.round((new Date().getSeconds() / 60) * 100); - return ; + return ( +
    + +
    + +
    + {uptime} +
    +
    {t("resources.uptime")}
    +
    + +
    +
    + ); } diff --git a/src/components/widgets/search/search.jsx b/src/components/widgets/search/search.jsx index 1bac4a61..4689567f 100644 --- a/src/components/widgets/search/search.jsx +++ b/src/components/widgets/search/search.jsx @@ -1,13 +1,10 @@ -import { useState, useEffect, useCallback, Fragment } from "react"; +import { useState, useEffect, Fragment } from "react"; import { useTranslation } from "next-i18next"; import { FiSearch } from "react-icons/fi"; import { SiDuckduckgo, SiMicrosoftbing, SiGoogle, SiBaidu, SiBrave } from "react-icons/si"; import { Listbox, Transition } from "@headlessui/react"; import classNames from "classnames"; -import ContainerForm from "../widget/container_form"; -import Raw from "../widget/raw"; - export const searchProviders = { google: { name: "Google", @@ -79,9 +76,14 @@ export default function Search({ options }) { setSelectedProvider(storedProvider); } }, [availableProviderIds]); + + if (!availableProviderIds) { + return null; + } - const submitCallback = useCallback(event => { + function handleSubmit(event) { const q = encodeURIComponent(query); + const { url } = selectedProvider; if (url) { window.open(`${url}${q}`, options.target || "_blank"); @@ -92,10 +94,6 @@ export default function Search({ options }) { event.preventDefault(); event.target.reset(); setQuery(""); - }, [options.target, options.url, query, selectedProvider]); - - if (!availableProviderIds) { - return null; } const onChangeProvider = (provider) => { @@ -103,79 +101,77 @@ export default function Search({ options }) { localStorage.setItem(localStorageKey, provider.name); } - return - -
    -
    - setQuery(s.currentTarget.value)} - required - autoCapitalize="off" - autoCorrect="off" - autoComplete="off" - // eslint-disable-next-line jsx-a11y/no-autofocus - autoFocus={options.focus} - /> - -
    - - - {t("search.search")} - -
    - +
    + setQuery(s.currentTarget.value)} + required + autoCapitalize="off" + autoCorrect="off" + autoComplete="off" + // eslint-disable-next-line jsx-a11y/no-autofocus + autoFocus={options.focus} + /> + +
    + - -
    - {availableProviderIds.map((providerId) => { - const p = searchProviders[providerId]; - return ( - - {({ active }) => ( -
  • - -
  • - )} -
    - ); - })} -
    -
    - - -
    - - ; + + {t("search.search")} + +
    + + +
    + {availableProviderIds.map((providerId) => { + const p = searchProviders[providerId]; + return ( + + {({ active }) => ( +
  • + +
  • + )} +
    + ); + })} +
    +
    +
    +
    + + ); } diff --git a/src/components/widgets/unifi_console/unifi_console.jsx b/src/components/widgets/unifi_console/unifi_console.jsx index dad92cc7..13c90bd4 100644 --- a/src/components/widgets/unifi_console/unifi_console.jsx +++ b/src/components/widgets/unifi_console/unifi_console.jsx @@ -3,12 +3,6 @@ import { MdSettingsEthernet } from "react-icons/md"; import { useTranslation } from "next-i18next"; import { SiUbiquiti } from "react-icons/si"; -import Error from "../widget/error"; -import Container from "../widget/container"; -import Raw from "../widget/raw"; -import WidgetIcon from "../widget/widget_icon"; -import PrimaryText from "../widget/primary_text"; - import useWidgetAPI from "utils/proxy/use-widget-api"; export default function Widget({ options }) { @@ -19,16 +13,35 @@ export default function Widget({ options }) { const { data: statsData, error: statsError } = useWidgetAPI(options, "stat/sites", { index: options.index }); if (statsError) { - return + return ( +
    +
    +
    + +
    + {t("widget.api_error")} +
    +
    +
    +
    + ); } const defaultSite = options.site ? statsData?.data.find(s => s.desc === options.site) : statsData?.data?.find(s => s.name === "default"); if (!defaultSite) { - return - {t("unifi.wait")} - - ; + return ( +
    +
    +
    + +
    +
    + {t("unifi.wait")} +
    +
    +
    + ); } const wan = defaultSite.health.find(h => h.subsystem === "wan"); @@ -43,9 +56,8 @@ export default function Widget({ options }) { const dataEmpty = !(wan.show || lan.show || wlan.show || uptime); - return - -
    + return ( +
    @@ -129,7 +141,6 @@ export default function Widget({ options }) {
    }
    -
    -
    -
    +
    + ); } diff --git a/src/components/widgets/weather/weather.jsx b/src/components/widgets/weather/weather.jsx index 702ea669..20bf3dec 100644 --- a/src/components/widgets/weather/weather.jsx +++ b/src/components/widgets/weather/weather.jsx @@ -1,16 +1,10 @@ import useSWR from "swr"; import { useState } from "react"; +import { BiError } from "react-icons/bi"; import { WiCloudDown } from "react-icons/wi"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { useTranslation } from "next-i18next"; -import Error from "../widget/error"; -import Container from "../widget/container"; -import PrimaryText from "../widget/primary_text"; -import SecondaryText from "../widget/secondary_text"; -import WidgetIcon from "../widget/widget_icon"; -import ContainerButton from "../widget/container_button"; - import Icon from "./icon"; function Widget({ options }) { @@ -21,35 +15,59 @@ function Widget({ options }) { ); if (error || data?.error) { - return + return ( +
    +
    +
    + +
    + {t("widget.api_error")} + - +
    +
    +
    +
    + ); } if (!data) { - return - {t("weather.updating")} - {t("weather.wait")} - - ; + return ( +
    +
    +
    + +
    +
    + {t("weather.updating")} + {t("weather.wait")} +
    +
    +
    + ); } const unit = options.units === "metric" ? "celsius" : "fahrenheit"; - const weatherInfo = { - condition: data.current.condition.code, - timeOfDay: data.current.is_day ? "day" : "night", - }; - return - - {options.label && `${options.label}, `} - {t("common.number", { - value: options.units === "metric" ? data.current.temp_c : data.current.temp_f, - style: "unit", - unit, - })} - - {data.current.condition.text} - - ; + return ( +
    +
    +
    + +
    +
    + + {options.label && `${options.label}, `} + {t("common.number", { + value: options.units === "metric" ? data.current.temp_c : data.current.temp_f, + style: "unit", + unit, + })} + + {data.current.condition.text} +
    +
    +
    + ); } export default function WeatherApi({ options }) { @@ -81,12 +99,30 @@ export default function WeatherApi({ options }) { } }; + // if (!requesting && !location) requestLocation(); + if (!location) { - return - {t("weather.current")} - {t("weather.allow")} - - ; + return ( + + ); } return ; diff --git a/src/components/widgets/widget.jsx b/src/components/widgets/widget.jsx index b4fdb143..47141887 100644 --- a/src/components/widgets/widget.jsx +++ b/src/components/widgets/widget.jsx @@ -17,13 +17,13 @@ const widgetMappings = { kubernetes: dynamic(() => import("components/widgets/kubernetes/kubernetes")), }; -export default function Widget({ widget, style }) { +export default function Widget({ widget }) { const InfoWidget = widgetMappings[widget.type]; if (InfoWidget) { return ( - + ); } diff --git a/src/components/widgets/widget/container.jsx b/src/components/widgets/widget/container.jsx deleted file mode 100644 index 3a4a9f57..00000000 --- a/src/components/widgets/widget/container.jsx +++ /dev/null @@ -1,42 +0,0 @@ -import classNames from "classnames"; - -import WidgetIcon from "./widget_icon"; -import PrimaryText from "./primary_text"; -import SecondaryText from "./secondary_text"; -import Raw from "./raw"; - -export function getAllClasses(options, additionalClassNames = '') { - return classNames( - "flex flex-col justify-center first:ml-0 ml-4 mr-2", - additionalClassNames, - options?.style === "boxedWidgets" && " ml-4 mt-2 m:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-2 pl-3", - ); -} - -export function getInnerBlock(children) { - // children won't be an array if it's Raw component - return Array.isArray(children) &&
    -
    {children.find(child => child.type === WidgetIcon)}
    -
    - {children.find(child => child.type === PrimaryText)} - {children.find(child => child.type === SecondaryText)} -
    -
    ; -} - -export function getBottomBlock(children) { - if (children.type !== Raw) { - return children.find(child => child.type === Raw) || []; - } - - return [children]; -} - -export default function Container({ children = [], options, additionalClassNames = '' }) { - return ( -
    - {getInnerBlock(children)} - {getBottomBlock(children)} -
    - ); -} diff --git a/src/components/widgets/widget/container_button.jsx b/src/components/widgets/widget/container_button.jsx deleted file mode 100644 index 92d8a416..00000000 --- a/src/components/widgets/widget/container_button.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import { getAllClasses, getInnerBlock, getBottomBlock } from "./container"; - -export default function ContainerButton ({ children = [], options, additionalClassNames = '', callback }) { - return ( - - ); -} diff --git a/src/components/widgets/widget/container_form.jsx b/src/components/widgets/widget/container_form.jsx deleted file mode 100644 index 7d28a1bb..00000000 --- a/src/components/widgets/widget/container_form.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import { getAllClasses, getInnerBlock, getBottomBlock } from "./container"; - -export default function ContainerForm ({ children = [], options, additionalClassNames = '', callback }) { - return ( -
    - {getInnerBlock(children)} - {getBottomBlock(children)} -
    - ); -} diff --git a/src/components/widgets/widget/container_link.jsx b/src/components/widgets/widget/container_link.jsx deleted file mode 100644 index 8ef0e80a..00000000 --- a/src/components/widgets/widget/container_link.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import { getAllClasses, getInnerBlock, getBottomBlock } from "./container"; - -export default function ContainerLink ({ children = [], options, additionalClassNames = '', target }) { - return ( - - {getInnerBlock(children)} - {getBottomBlock(children)} - - ); -} diff --git a/src/components/widgets/widget/error.jsx b/src/components/widgets/widget/error.jsx deleted file mode 100644 index a3dbab85..00000000 --- a/src/components/widgets/widget/error.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import { useTranslation } from "react-i18next"; -import { BiError } from "react-icons/bi"; - -import Container from "./container"; -import PrimaryText from "./primary_text"; -import WidgetIcon from "./widget_icon"; - -export default function Error({ options }) { - const { t } = useTranslation(); - - return - {t("widget.api_error")} - - ; -} diff --git a/src/components/widgets/widget/primary_text.jsx b/src/components/widgets/widget/primary_text.jsx deleted file mode 100644 index 3418b92c..00000000 --- a/src/components/widgets/widget/primary_text.jsx +++ /dev/null @@ -1,5 +0,0 @@ -export default function PrimaryText({ children }) { - return ( - {children} - ); -} diff --git a/src/components/widgets/widget/raw.jsx b/src/components/widgets/widget/raw.jsx deleted file mode 100644 index 44e3dddc..00000000 --- a/src/components/widgets/widget/raw.jsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function Raw({ children }) { - if (children.type === Raw) { - return [children]; - } - - return children; -} diff --git a/src/components/widgets/widget/resource.jsx b/src/components/widgets/widget/resource.jsx deleted file mode 100644 index e77bcb5a..00000000 --- a/src/components/widgets/widget/resource.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import UsageBar from "../resources/usage-bar"; - -export default function Resource({ children, icon, value, label, expandedValue, expandedLabel, percentage, key, expanded = false }) { - const Icon = icon; - - return
    - -
    -
    -
    {value}
    -
    {label}
    -
    - { expanded &&
    -
    {expandedValue}
    -
    {expandedLabel}
    -
    - } - { percentage && } - { children } -
    -
    ; -} diff --git a/src/components/widgets/widget/resources.jsx b/src/components/widgets/widget/resources.jsx deleted file mode 100644 index 19fb021d..00000000 --- a/src/components/widgets/widget/resources.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import ContainerLink from "./container_link"; -import Resource from "./resource"; -import Raw from "./raw"; -import WidgetLabel from "./widget_label"; - -export default function Resources({ options, children, target }) { - return - -
    - { children.filter(child => child && child.type === Resource) } -
    - { children.filter(child => child && child.type === WidgetLabel) } -
    -
    ; -} diff --git a/src/components/widgets/widget/secondary_text.jsx b/src/components/widgets/widget/secondary_text.jsx deleted file mode 100644 index 363d1bd0..00000000 --- a/src/components/widgets/widget/secondary_text.jsx +++ /dev/null @@ -1,5 +0,0 @@ -export default function SecondaryText({ children }) { - return ( - {children} - ); -} diff --git a/src/components/widgets/widget/widget_icon.jsx b/src/components/widgets/widget/widget_icon.jsx deleted file mode 100644 index 9766a879..00000000 --- a/src/components/widgets/widget/widget_icon.jsx +++ /dev/null @@ -1,18 +0,0 @@ -export default function WidgetIcon({ icon, size = "s", pulse = false, weatherInfo = {} }) { - const Icon = icon; - const { condition, timeOfDay } = weatherInfo; - let additionalClasses = "text-theme-800 dark:text-theme-200 "; - - switch (size) { - case "m": additionalClasses += "w-6 h-6 "; break; - case "l": additionalClasses += "w-8 h-8 "; break; - case "xl": additionalClasses += "w-10 h-10 "; break; - default: additionalClasses += "w-5 h-5 "; - } - - if (pulse) { - additionalClasses += "animate-pulse "; - } - - return ; -} diff --git a/src/components/widgets/widget/widget_label.jsx b/src/components/widgets/widget/widget_label.jsx deleted file mode 100644 index dcb9b9e9..00000000 --- a/src/components/widgets/widget/widget_label.jsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function WidgetLabel({ label = "" }) { - return
    {label}
    -} diff --git a/src/pages/api/widgets/longhorn.js b/src/pages/api/widgets/longhorn.js index d23a7f61..a6b6781c 100644 --- a/src/pages/api/widgets/longhorn.js +++ b/src/pages/api/widgets/longhorn.js @@ -46,7 +46,7 @@ function parseLonghornData(data) { export default async function handler(req, res) { const settings = getSettings(); - const longhornSettings = settings?.providers?.longhorn || {}; + const longhornSettings = settings?.providers?.longhorn; const {url, username, password} = longhornSettings; if (!url) { diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 006456f9..e170d4e1 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -160,7 +160,6 @@ const headerStyles = { "m-4 mb-0 sm:m-8 sm:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-3", underlined: "m-4 mb-0 sm:m-8 sm:mb-1 border-b-2 pb-4 border-theme-800 dark:border-theme-200/50", clean: "m-4 mb-0 sm:m-8 sm:mb-0", - boxedWidgets: "m-4 mb-0 sm:m-8 sm:mb-0 sm:mt-1", }; function Home({ initialSettings }) { @@ -209,7 +208,6 @@ function Home({ initialSettings }) { searchProvider = searchProviders[searchWidget.options?.provider]; } } - const headerStyle = initialSettings?.headerStyle || "underlined"; useEffect(() => { function handleKeyDown(e) { @@ -258,7 +256,7 @@ function Home({ initialSettings }) {
    !rightAlignedWidgets.includes(widget.type)) .map((widget, i) => ( - + ))} -
    +
    {widgets .filter((widget) => rightAlignedWidgets.includes(widget.type)) .map((widget, i) => ( - + ))}
    From 1d809556490d31c753114aae09d2470bb6c20caf Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Sat, 10 Jun 2023 11:28:47 +0000 Subject: [PATCH 106/207] Translated using Weblate (Spanish) Currently translated at 100.0% (465 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/ --- public/locales/es/common.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales/es/common.json b/public/locales/es/common.json index 1782bb92..32fa7e6e 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -177,7 +177,7 @@ "lidarr": { "queued": "En cola", "wanted": "Buscando", - "artists": "Artists" + "artists": "Artistas" }, "adguard": { "queries": "Consultas", From 7af36eb106e14d32d20cad4616cad638a76109a5 Mon Sep 17 00:00:00 2001 From: Nonoss117 Date: Fri, 9 Jun 2023 14:10:07 +0000 Subject: [PATCH 107/207] Translated using Weblate (French) Currently translated at 100.0% (465 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/ --- public/locales/fr/common.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 4cc6dce6..985f3747 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -177,7 +177,7 @@ "lidarr": { "wanted": "Demandé", "queued": "En queue", - "artists": "Artists" + "artists": "Artistes" }, "adguard": { "queries": "Requêtes", @@ -401,7 +401,7 @@ "queue": "À traiter", "processed": "Traité", "errored": "En erreur", - "saved": "Gagné" + "saved": "Libéré" }, "miniflux": { "read": "Lu", From 0d6ccb036ee0241e9027881130a9c16799189322 Mon Sep 17 00:00:00 2001 From: Dan Date: Sat, 10 Jun 2023 14:32:27 +0000 Subject: [PATCH 108/207] Translated using Weblate (Ukrainian) Currently translated at 100.0% (465 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/ --- public/locales/uk/common.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index 6b112e8f..1e1ac9b4 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -247,7 +247,7 @@ "lidarr": { "wanted": "Розшукується", "queued": "У черзі", - "artists": "Artists" + "artists": "Виконавці" }, "traefik": { "middleware": "Проміжне програмне забезпечення", From 1fb7be7457188013b4afa5150b4ea8591e561c93 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 11 Jun 2023 09:50:41 -0700 Subject: [PATCH 109/207] Retrieve ping url from config rather than as query parameter --- src/components/services/group.jsx | 4 ++-- src/components/services/item.jsx | 4 ++-- src/components/services/list.jsx | 4 ++-- src/components/services/ping.jsx | 6 +++--- src/pages/api/ping.js | 12 +++++++++++- src/pages/index.jsx | 2 +- src/utils/config/service-helpers.js | 27 ++++++++++++++------------- 7 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/components/services/group.jsx b/src/components/services/group.jsx index 5f1c5446..94557064 100644 --- a/src/components/services/group.jsx +++ b/src/components/services/group.jsx @@ -3,7 +3,7 @@ import classNames from "classnames"; import List from "components/services/list"; import ResolvedIcon from "components/resolvedicon"; -export default function ServicesGroup({ services, layout, fiveColumns }) { +export default function ServicesGroup({ group, services, layout, fiveColumns }) { return (
    {services.name}
    - +
    ); } diff --git a/src/components/services/item.jsx b/src/components/services/item.jsx index 08b8d1f4..36e454ce 100644 --- a/src/components/services/item.jsx +++ b/src/components/services/item.jsx @@ -11,7 +11,7 @@ import Kubernetes from "widgets/kubernetes/component"; import { SettingsContext } from "utils/contexts/settings"; import ResolvedIcon from "components/resolvedicon"; -export default function Item({ service }) { +export default function Item({ service, group }) { const hasLink = service.href && service.href !== "#"; const { settings } = useContext(SettingsContext); const showStats = (service.showStats === false) ? false : settings.showStats; @@ -77,7 +77,7 @@ export default function Item({ service }) {
    {service.ping && (
    - + Ping status
    )} diff --git a/src/components/services/list.jsx b/src/components/services/list.jsx index c8028df5..85083af3 100644 --- a/src/components/services/list.jsx +++ b/src/components/services/list.jsx @@ -14,7 +14,7 @@ const columnMap = [ "grid-cols-1 md:grid-cols-2 lg:grid-cols-8", ]; -export default function List({ services, layout }) { +export default function List({ group, services, layout }) { return (
      {services.map((service) => ( - + ))}
    ); diff --git a/src/components/services/ping.jsx b/src/components/services/ping.jsx index a54b1b55..291bc9e0 100644 --- a/src/components/services/ping.jsx +++ b/src/components/services/ping.jsx @@ -1,9 +1,9 @@ import { useTranslation } from "react-i18next"; import useSWR from "swr"; -export default function Ping({ service }) { +export default function Ping({ group, service }) { const { t } = useTranslation(); - const { data, error } = useSWR(`/api/ping?${new URLSearchParams({ping: service.ping}).toString()}`, { + const { data, error } = useSWR(`/api/ping?${new URLSearchParams({ group, service }).toString()}`, { refreshInterval: 30000 }); @@ -23,7 +23,7 @@ export default function Ping({ service }) { ); } - const statusText = `${service.ping}: HTTP status ${data.status}`; + const statusText = `${service}: HTTP status ${data.status}`; if (data.status > 403) { return ( diff --git a/src/pages/api/ping.js b/src/pages/api/ping.js index 96c1b12c..cfc2aafa 100644 --- a/src/pages/api/ping.js +++ b/src/pages/api/ping.js @@ -1,12 +1,22 @@ import { performance } from "perf_hooks"; +import { getServiceItem } from "utils/config/service-helpers"; import createLogger from "utils/logger"; import { httpProxy } from "utils/proxy/http"; const logger = createLogger("ping"); export default async function handler(req, res) { - const { ping: pingURL } = req.query; + const { group, service } = req.query; + const serviceItem = await getServiceItem(group, service); + if (!serviceItem) { + logger.debug(`No service item found for group ${group} named ${service}`); + return res.status(400).send({ + error: "Unable to find service, see log for details.", + }); + } + + const { ping: pingURL } = serviceItem; if (!pingURL) { logger.debug("No ping URL specified"); diff --git a/src/pages/index.jsx b/src/pages/index.jsx index e170d4e1..6180ff51 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -289,7 +289,7 @@ function Home({ initialSettings }) { {services?.length > 0 && (
    {services.map((group) => ( - + ))}
    )} diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index c63fa8f2..d4f7bc4e 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -328,16 +328,13 @@ export function cleanServiceGroups(groups) { })); } -export default async function getServiceWidget(group, service) { +export async function getServiceItem(group, service) { const configuredServices = await servicesFromConfig(); const serviceGroup = configuredServices.find((g) => g.name === group); if (serviceGroup) { const serviceEntry = serviceGroup.services.find((s) => s.name === service); - if (serviceEntry) { - const { widget } = serviceEntry; - return widget; - } + if (serviceEntry) return serviceEntry; } const discoveredServices = await servicesFromDocker(); @@ -345,20 +342,24 @@ export default async function getServiceWidget(group, service) { const dockerServiceGroup = discoveredServices.find((g) => g.name === group); if (dockerServiceGroup) { const dockerServiceEntry = dockerServiceGroup.services.find((s) => s.name === service); - if (dockerServiceEntry) { - const { widget } = dockerServiceEntry; - return widget; - } + if (dockerServiceEntry) return dockerServiceEntry; } const kubernetesServices = await servicesFromKubernetes(); const kubernetesServiceGroup = kubernetesServices.find((g) => g.name === group); if (kubernetesServiceGroup) { const kubernetesServiceEntry = kubernetesServiceGroup.services.find((s) => s.name === service); - if (kubernetesServiceEntry) { - const { widget } = kubernetesServiceEntry; - return widget; - } + if (kubernetesServiceEntry) return kubernetesServiceEntry; + } + + return false; +} + +export default async function getServiceWidget(group, service) { + const serviceItem = await getServiceItem(group, service); + if (serviceItem) { + const { widget } = serviceItem; + return widget; } return false; From c5b6dcc1e08eb6fd1a8c01c776970a9f873545b5 Mon Sep 17 00:00:00 2001 From: Denis Papec Date: Sun, 16 Apr 2023 00:05:50 +0100 Subject: [PATCH 110/207] Add optional boxed styling and error component to information widgets Signed-off-by: Denis Papec --- src/components/widgets/datetime/datetime.jsx | 8 +++-- src/components/widgets/error.jsx | 23 +++++++++++++ src/components/widgets/glances/glances.jsx | 30 +++++++--------- src/components/widgets/greeting/greeting.jsx | 7 +++- .../widgets/kubernetes/kubernetes.jsx | 29 +++++++--------- src/components/widgets/logo/logo.jsx | 7 +++- src/components/widgets/longhorn/longhorn.jsx | 25 +++++++------- .../widgets/openmeteo/openmeteo.jsx | 34 +++++++++---------- .../widgets/openweathermap/weather.jsx | 33 +++++++++--------- .../widgets/resources/resources.jsx | 7 +++- src/components/widgets/search/search.jsx | 11 +++--- .../widgets/unifi_console/unifi_console.jsx | 26 +++++++------- src/components/widgets/weather/weather.jsx | 33 +++++++++--------- src/pages/api/widgets/longhorn.js | 2 +- 14 files changed, 153 insertions(+), 122 deletions(-) create mode 100644 src/components/widgets/error.jsx diff --git a/src/components/widgets/datetime/datetime.jsx b/src/components/widgets/datetime/datetime.jsx index 86983473..fc883ec3 100644 --- a/src/components/widgets/datetime/datetime.jsx +++ b/src/components/widgets/datetime/datetime.jsx @@ -1,5 +1,6 @@ import { useState, useEffect } from "react"; import { useTranslation } from "next-i18next"; +import classNames from "classnames"; const textSizes = { "4xl": "text-4xl", @@ -17,7 +18,7 @@ export default function DateTime({ options }) { const { i18n } = useTranslation(); const [date, setDate] = useState(""); const dateLocale = locale ?? i18n.language; - + useEffect(() => { const dateFormat = new Intl.DateTimeFormat(dateLocale, { ...format }); const interval = setInterval(() => { @@ -27,7 +28,10 @@ export default function DateTime({ options }) { }, [date, setDate, dateLocale, format]); return ( -
    +
    {date} diff --git a/src/components/widgets/error.jsx b/src/components/widgets/error.jsx new file mode 100644 index 00000000..92e0076a --- /dev/null +++ b/src/components/widgets/error.jsx @@ -0,0 +1,23 @@ +import { useTranslation } from "react-i18next"; +import { BiError } from "react-icons/bi"; +import classNames from "classnames"; + +export default function Error({ options }) { + const { t } = useTranslation(); + + return ( +
    +
    +
    + +
    + {t("widget.api_error")} +
    +
    +
    +
    + ); +} diff --git a/src/components/widgets/glances/glances.jsx b/src/components/widgets/glances/glances.jsx index 85dd44c0..b6daba7b 100644 --- a/src/components/widgets/glances/glances.jsx +++ b/src/components/widgets/glances/glances.jsx @@ -1,11 +1,12 @@ import useSWR from "swr"; import { useContext } from "react"; -import { BiError } from "react-icons/bi"; import { FaMemory, FaRegClock, FaThermometerHalf } from "react-icons/fa"; import { FiCpu, FiHardDrive } from "react-icons/fi"; import { useTranslation } from "next-i18next"; +import classNames from "classnames"; import UsageBar from "../resources/usage-bar"; +import Error from "../error"; import { SettingsContext } from "utils/contexts/settings"; @@ -26,23 +27,15 @@ export default function Widget({ options }) { ); if (error || data?.error) { - return ( -
    -
    -
    - -
    - {t("widget.api_error")} -
    -
    -
    -
    - ); + return } if (!data) { return ( -
    +
    @@ -101,7 +94,10 @@ export default function Widget({ options }) { } return ( - +
    @@ -184,7 +180,7 @@ export default function Widget({ options }) {
    - {t("common.number", { + {t("common.number", { value: mainTemp, maximumFractionDigits: 1, style: "unit", @@ -196,7 +192,7 @@ export default function Widget({ options }) { {options.expanded && (
    - {t("common.number", { + {t("common.number", { value: maxTemp, maximumFractionDigits: 1, style: "unit", diff --git a/src/components/widgets/greeting/greeting.jsx b/src/components/widgets/greeting/greeting.jsx index da0f063d..2e129560 100644 --- a/src/components/widgets/greeting/greeting.jsx +++ b/src/components/widgets/greeting/greeting.jsx @@ -1,3 +1,5 @@ +import classNames from "classnames"; + const textSizes = { "4xl": "text-4xl", "3xl": "text-3xl", @@ -12,7 +14,10 @@ const textSizes = { export default function Greeting({ options }) { if (options.text) { return ( -
    +
    {options.text} diff --git a/src/components/widgets/kubernetes/kubernetes.jsx b/src/components/widgets/kubernetes/kubernetes.jsx index 78c4caaf..514993da 100644 --- a/src/components/widgets/kubernetes/kubernetes.jsx +++ b/src/components/widgets/kubernetes/kubernetes.jsx @@ -1,12 +1,14 @@ import useSWR from "swr"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import classNames from "classnames"; + +import Error from "../error"; import Node from "./node"; export default function Widget({ options }) { const { cluster, nodes } = options; - const { t, i18n } = useTranslation(); + const { i18n } = useTranslation(); const defaultData = { cpu: { @@ -29,23 +31,15 @@ export default function Widget({ options }) { ); if (error || data?.error) { - return ( -
    -
    -
    - -
    - {t("widget.api_error")} -
    -
    -
    -
    - ); + return } if (!data) { return ( -
    +
    {cluster.show && @@ -59,7 +53,10 @@ export default function Widget({ options }) { } return ( -
    +
    {cluster.show && diff --git a/src/components/widgets/logo/logo.jsx b/src/components/widgets/logo/logo.jsx index 96e8569f..6cba17bf 100644 --- a/src/components/widgets/logo/logo.jsx +++ b/src/components/widgets/logo/logo.jsx @@ -1,8 +1,13 @@ +import classNames from "classnames"; + import ResolvedIcon from "components/resolvedicon" export default function Logo({ options }) { return ( -
    +
    {options.icon ? : // fallback to homepage logo diff --git a/src/components/widgets/longhorn/longhorn.jsx b/src/components/widgets/longhorn/longhorn.jsx index 9fcb21b4..5139f00a 100644 --- a/src/components/widgets/longhorn/longhorn.jsx +++ b/src/components/widgets/longhorn/longhorn.jsx @@ -1,37 +1,36 @@ import useSWR from "swr"; -import { BiError } from "react-icons/bi"; -import { useTranslation } from "next-i18next"; +import classNames from "classnames"; + +import Error from "../error"; import Node from "./node"; export default function Longhorn({ options }) { const { expanded, total, labels, include, nodes } = options; - const { t } = useTranslation(); const { data, error } = useSWR(`/api/widgets/longhorn`, { refreshInterval: 1500 }); if (error || data?.error) { - return ( -
    - -
    - {t("widget.api_error")} -
    -
    - ); + return } if (!data) { return ( -
    +
    ); } return ( -
    +
    {data.nodes .filter((node) => { diff --git a/src/components/widgets/openmeteo/openmeteo.jsx b/src/components/widgets/openmeteo/openmeteo.jsx index 0d29aef5..1381cc55 100644 --- a/src/components/widgets/openmeteo/openmeteo.jsx +++ b/src/components/widgets/openmeteo/openmeteo.jsx @@ -1,9 +1,11 @@ import useSWR from "swr"; import { useState } from "react"; -import { BiError } from "react-icons/bi"; import { WiCloudDown } from "react-icons/wi"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { useTranslation } from "next-i18next"; +import classNames from "classnames"; + +import Error from "../error"; import Icon from "./icon"; @@ -15,24 +17,15 @@ function Widget({ options }) { ); if (error || data?.error) { - return ( -
    -
    -
    - -
    - {t("widget.api_error")} - - -
    -
    -
    -
    - ); + return } if (!data) { return ( -
    +
    @@ -50,7 +43,10 @@ function Widget({ options }) { const timeOfDay = data.current_weather.time > data.daily.sunrise[0] && data.current_weather.time < data.daily.sunset[0] ? "day" : "night"; return ( -
    +
    @@ -107,8 +103,10 @@ export default function OpenMeteo({ options }) { - ); + return + {t("weather.current")} + {t("weather.allow")} + + ; } return ; diff --git a/src/components/widgets/openweathermap/weather.jsx b/src/components/widgets/openweathermap/weather.jsx index b404039f..30531513 100644 --- a/src/components/widgets/openweathermap/weather.jsx +++ b/src/components/widgets/openweathermap/weather.jsx @@ -3,12 +3,17 @@ import { useState } from "react"; import { WiCloudDown } from "react-icons/wi"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { useTranslation } from "next-i18next"; -import classNames from "classnames"; -import Error from "../error"; +import Error from "../widget/error"; +import Container from "../widget/container"; +import ContainerButton from "../widget/container_button"; +import PrimaryText from "../widget/primary_text"; +import SecondaryText from "../widget/secondary_text"; +import WidgetIcon from "../widget/widget_icon"; import Icon from "./icon"; + function Widget({ options }) { const { t, i18n } = useTranslation(); @@ -21,48 +26,26 @@ function Widget({ options }) { } if (!data) { - return ( -
    -
    -
    - -
    -
    - {t("weather.updating")} - {t("weather.wait")} -
    -
    -
    - ); + return + {t("weather.updating")} + {t("weather.wait")} + + ; } const unit = options.units === "metric" ? "celsius" : "fahrenheit"; - return ( -
    -
    -
    - data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night"} - /> -
    -
    - - {options.label && `${options.label}, `} - {t("common.number", { value: data.main.temp, style: "unit", unit })} - - {data.weather[0].description} -
    -
    -
    - ); + const weatherInfo = { + condition: data.weather[0].id, + timeOfDay: data.dt > data.sys.sunrise && data.dt < data.sys.sunset ? "day" : "night" + }; + + return + {options.label && `${options.label}, `} + {t("common.number", { value: data.main.temp, style: "unit", unit })} + {data.weather[0].description} + + ; } export default function OpenWeatherMap({ options }) { @@ -94,33 +77,12 @@ export default function OpenWeatherMap({ options }) { } }; - // if (!requesting && !location) requestLocation(); - if (!location) { - return ( - - ); + return + {t("weather.current")} + {t("weather.allow")} + + ; } return ; diff --git a/src/components/widgets/resources/cpu.jsx b/src/components/widgets/resources/cpu.jsx index 7069e3c4..242e7a3d 100644 --- a/src/components/widgets/resources/cpu.jsx +++ b/src/components/widgets/resources/cpu.jsx @@ -1,8 +1,13 @@ import useSWR from "swr"; import { FiCpu } from "react-icons/fi"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import SingleResource from "../widget/single_resource"; +import WidgetIcon from "../widget/widget_icon"; +import ResourceValue from "../widget/resource_value"; +import ResourceLabel from "../widget/resource_label"; +import Error from "../widget/error"; + import UsageBar from "./usage-bar"; export default function Cpu({ expanded }) { @@ -13,67 +18,38 @@ export default function Cpu({ expanded }) { }); if (error || data?.error) { - return ( -
    - -
    - {t("widget.api_error")} -
    -
    - ); + return } if (!data) { - return ( -
    - -
    -
    -
    -
    -
    {t("resources.cpu")}
    -
    - {expanded && ( -
    -
    -
    -
    {t("resources.load")}
    -
    - )} - -
    -
    - ); + return + + - + {t("resources.cpu")} + - + {t("resources.load")} + + } - const percent = data.cpu.usage; - - return ( -
    - -
    -
    -
    - {t("common.number", { - value: data.cpu.usage, - style: "unit", - unit: "percent", - maximumFractionDigits: 0, - })} -
    -
    {t("resources.cpu")}
    -
    - {expanded && ( -
    -
    - {t("common.number", { - value: data.cpu.load, - maximumFractionDigits: 2, - })} -
    -
    {t("resources.load")}
    -
    - )} - -
    -
    - ); + return + + + {t("common.number", { + value: data.cpu.usage, + style: "unit", + unit: "percent", + maximumFractionDigits: 0, + })} + + {t("resources.cpu")} + + {t("common.number", { + value: data.cpu.load, + maximumFractionDigits: 2, + })} + + {t("resources.load")} + + } diff --git a/src/components/widgets/resources/cputemp.jsx b/src/components/widgets/resources/cputemp.jsx index 571e6c8a..1a62aa31 100644 --- a/src/components/widgets/resources/cputemp.jsx +++ b/src/components/widgets/resources/cputemp.jsx @@ -1,8 +1,13 @@ import useSWR from "swr"; import { FaThermometerHalf } from "react-icons/fa"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import SingleResource from "../widget/single_resource"; +import WidgetIcon from "../widget/widget_icon"; +import ResourceValue from "../widget/resource_value"; +import ResourceLabel from "../widget/resource_label"; +import Error from "../widget/error"; + import UsageBar from "./usage-bar"; function convertToFahrenheit(t) { @@ -17,34 +22,17 @@ export default function CpuTemp({ expanded, units }) { }); if (error || data?.error) { - return ( -
    - -
    - {t("widget.api_error")} -
    -
    - ); + return } if (!data || !data.cputemp) { - return ( -
    - -
    - -
    -
    -
    {t("resources.temp")}
    -
    - {expanded && ( - -
    -
    -
    {t("resources.max")}
    -
    - )} -
    -
    - ); + return + + - + {t("resources.temp")} + - + {t("resources.max")} + } let mainTemp = data.cputemp.main; @@ -54,38 +42,27 @@ export default function CpuTemp({ expanded, units }) { const unit = units === "imperial" ? "fahrenheit" : "celsius"; mainTemp = (unit === "celsius") ? mainTemp : convertToFahrenheit(mainTemp); const maxTemp = (unit === "celsius") ? data.cputemp.max : convertToFahrenheit(data.cputemp.max); - const percent = Math.round((mainTemp / maxTemp) * 100); - return ( -
    - -
    - -
    - {t("common.number", { - value: mainTemp, - maximumFractionDigits: 1, - style: "unit", - unit - })} -
    -
    {t("resources.temp")}
    -
    - {expanded && ( - -
    - {t("common.number", { - value: maxTemp, - maximumFractionDigits: 1, - style: "unit", - unit - })} -
    -
    {t("resources.max")}
    -
    - )} - -
    -
    - ); + return + + + {t("common.number", { + value: mainTemp, + maximumFractionDigits: 1, + style: "unit", + unit + })} + + {t("resources.temp")} + + {t("common.number", { + value: maxTemp, + maximumFractionDigits: 1, + style: "unit", + unit + })} + + {t("resources.max")} + + ; } diff --git a/src/components/widgets/resources/disk.jsx b/src/components/widgets/resources/disk.jsx index ca09c095..742ff9d7 100644 --- a/src/components/widgets/resources/disk.jsx +++ b/src/components/widgets/resources/disk.jsx @@ -1,8 +1,13 @@ import useSWR from "swr"; import { FiHardDrive } from "react-icons/fi"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import SingleResource from "../widget/single_resource"; +import WidgetIcon from "../widget/widget_icon"; +import ResourceValue from "../widget/resource_value"; +import ResourceLabel from "../widget/resource_label"; +import Error from "../widget/error"; + import UsageBar from "./usage-bar"; export default function Disk({ options, expanded }) { @@ -13,56 +18,29 @@ export default function Disk({ options, expanded }) { }); if (error || data?.error) { - return ( -
    - -
    - {t("widget.api_error")} -
    -
    - ); + return } if (!data) { - return ( -
    - -
    - -
    -
    -
    {t("resources.free")}
    -
    - {expanded && ( - -
    -
    -
    {t("resources.total")}
    -
    - )} - -
    -
    - ); + return + + - + {t("resources.free")} + - + {t("resources.total")} + + ; } // data.drive.used not accurate? const percent = Math.round(((data.drive.size - data.drive.available) / data.drive.size) * 100); - return ( -
    - -
    - -
    {t("common.bytes", { value: data.drive.available })}
    -
    {t("resources.free")}
    -
    - {expanded && ( - -
    {t("common.bytes", { value: data.drive.size })}
    -
    {t("resources.total")}
    -
    - )} - -
    -
    - ); + return + + {t("common.bytes", { value: data.drive.available })} + {t("resources.free")} + {t("common.bytes", { value: data.drive.size })} + {t("resources.total")} + + ; } diff --git a/src/components/widgets/resources/memory.jsx b/src/components/widgets/resources/memory.jsx index 30b7c8eb..97c74acc 100644 --- a/src/components/widgets/resources/memory.jsx +++ b/src/components/widgets/resources/memory.jsx @@ -1,8 +1,13 @@ import useSWR from "swr"; import { FaMemory } from "react-icons/fa"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import SingleResource from "../widget/single_resource"; +import WidgetIcon from "../widget/widget_icon"; +import ResourceValue from "../widget/resource_value"; +import ResourceLabel from "../widget/resource_label"; +import Error from "../widget/error"; + import UsageBar from "./usage-bar"; export default function Memory({ expanded }) { @@ -13,63 +18,34 @@ export default function Memory({ expanded }) { }); if (error || data?.error) { - return ( -
    - -
    - {t("widget.api_error")} -
    -
    - ); + return } if (!data) { - return ( -
    - -
    - -
    -
    -
    {t("resources.free")}
    -
    - {expanded && ( - -
    -
    -
    {t("resources.total")}
    -
    - )} - -
    -
    - ); + return + + - + {t("resources.free")} + - + {t("resources.total")} + + ; } const percent = Math.round((data.memory.active / data.memory.total) * 100); - return ( -
    - -
    - -
    - {t("common.bytes", { value: data.memory.available, maximumFractionDigits: 1, binary: true })} -
    -
    {t("resources.free")}
    -
    - {expanded && ( - -
    - {t("common.bytes", { - value: data.memory.total, - maximumFractionDigits: 1, - binary: true, - })} -
    -
    {t("resources.total")}
    -
    - )} - -
    -
    - ); + return + + {t("common.bytes", { value: data.memory.available, maximumFractionDigits: 1, binary: true })} + {t("resources.free")} + + {t("common.bytes", { + value: data.memory.total, + maximumFractionDigits: 1, + binary: true, + })} + + {t("resources.total")} + + ; } diff --git a/src/components/widgets/resources/resources.jsx b/src/components/widgets/resources/resources.jsx index 5727a2a0..0cc2c301 100644 --- a/src/components/widgets/resources/resources.jsx +++ b/src/components/widgets/resources/resources.jsx @@ -1,4 +1,5 @@ -import classNames from "classnames"; +import Container from "../widget/container"; +import Raw from "../widget/raw"; import Disk from "./disk"; import Cpu from "./cpu"; @@ -8,11 +9,8 @@ import Uptime from "./uptime"; export default function Resources({ options }) { const { expanded, units } = options; - return ( -
    + return +
    {options.cpu && } {options.memory && } @@ -25,6 +23,6 @@ export default function Resources({ options }) { {options.label && (
    {options.label}
    )} -
    - ); +
    +
    ; } diff --git a/src/components/widgets/resources/uptime.jsx b/src/components/widgets/resources/uptime.jsx index 3bf785b1..6cc2b8c5 100644 --- a/src/components/widgets/resources/uptime.jsx +++ b/src/components/widgets/resources/uptime.jsx @@ -1,8 +1,13 @@ import useSWR from "swr"; import { FaRegClock } from "react-icons/fa"; -import { BiError } from "react-icons/bi"; import { useTranslation } from "next-i18next"; +import SingleResource from "../widget/single_resource"; +import WidgetIcon from "../widget/widget_icon"; +import ResourceValue from "../widget/resource_value"; +import ResourceLabel from "../widget/resource_label"; +import Error from "../widget/error"; + import UsageBar from "./usage-bar"; export default function Uptime() { @@ -13,35 +18,22 @@ export default function Uptime() { }); if (error || data?.error) { - return ( -
    - -
    - {t("widget.api_error")} -
    -
    - ); + return } if (!data) { - return ( -
    - -
    - -
    -
    -
    {t("resources.temp")}
    -
    -
    -
    - ); + return + + - + {t("resources.uptime")} + ; } const mo = Math.floor(data.uptime / (3600 * 24 * 31)); const d = Math.floor(data.uptime % (3600 * 24 * 31) / (3600 * 24)); const h = Math.floor(data.uptime % (3600 * 24) / 3600); const m = Math.floor(data.uptime % 3600 / 60); - + let uptime; if (mo > 0) uptime = `${mo}${t("resources.months")} ${d}${t("resources.days")}`; else if (d > 0) uptime = `${d}${t("resources.days")} ${h}${t("resources.hours")}`; @@ -49,18 +41,10 @@ export default function Uptime() { const percent = Math.round((new Date().getSeconds() / 60) * 100); - return ( -
    - -
    - -
    - {uptime} -
    -
    {t("resources.uptime")}
    -
    - -
    -
    - ); + return + + {uptime} + {t("resources.uptime")} + + ; } diff --git a/src/components/widgets/search/search.jsx b/src/components/widgets/search/search.jsx index bca3eb58..1bac4a61 100644 --- a/src/components/widgets/search/search.jsx +++ b/src/components/widgets/search/search.jsx @@ -1,10 +1,13 @@ -import { useState, useEffect, Fragment } from "react"; +import { useState, useEffect, useCallback, Fragment } from "react"; import { useTranslation } from "next-i18next"; import { FiSearch } from "react-icons/fi"; import { SiDuckduckgo, SiMicrosoftbing, SiGoogle, SiBaidu, SiBrave } from "react-icons/si"; import { Listbox, Transition } from "@headlessui/react"; import classNames from "classnames"; +import ContainerForm from "../widget/container_form"; +import Raw from "../widget/raw"; + export const searchProviders = { google: { name: "Google", @@ -77,13 +80,8 @@ export default function Search({ options }) { } }, [availableProviderIds]); - if (!availableProviderIds) { - return null; - } - - function handleSubmit(event) { + const submitCallback = useCallback(event => { const q = encodeURIComponent(query); - const { url } = selectedProvider; if (url) { window.open(`${url}${q}`, options.target || "_blank"); @@ -94,6 +92,10 @@ export default function Search({ options }) { event.preventDefault(); event.target.reset(); setQuery(""); + }, [options.target, options.url, query, selectedProvider]); + + if (!availableProviderIds) { + return null; } const onChangeProvider = (provider) => { @@ -101,80 +103,79 @@ export default function Search({ options }) { localStorage.setItem(localStorageKey, provider.name); } - return ( - -
    - setQuery(s.currentTarget.value)} - required - autoCapitalize="off" - autoCorrect="off" - autoComplete="off" - // eslint-disable-next-line jsx-a11y/no-autofocus - autoFocus={options.focus} - /> - -
    - + +
    +
    + setQuery(s.currentTarget.value)} + required + autoCapitalize="off" + autoCorrect="off" + autoComplete="off" + // eslint-disable-next-line jsx-a11y/no-autofocus + autoFocus={options.focus} + /> + +
    + + + {t("search.search")} + +
    + - - {t("search.search")} - -
    - - -
    - {availableProviderIds.map((providerId) => { - const p = searchProviders[providerId]; - return ( - - {({ active }) => ( -
  • - -
  • - )} -
    - ); - })} -
    -
    -
    - - - ); + +
    + {availableProviderIds.map((providerId) => { + const p = searchProviders[providerId]; + return ( + + {({ active }) => ( +
  • + +
  • + )} +
    + ); + })} +
    +
    + + +
    +
    + ; } diff --git a/src/components/widgets/unifi_console/unifi_console.jsx b/src/components/widgets/unifi_console/unifi_console.jsx index 1896771f..dad92cc7 100644 --- a/src/components/widgets/unifi_console/unifi_console.jsx +++ b/src/components/widgets/unifi_console/unifi_console.jsx @@ -2,9 +2,12 @@ import { BiError, BiWifi, BiCheckCircle, BiXCircle, BiNetworkChart } from "react import { MdSettingsEthernet } from "react-icons/md"; import { useTranslation } from "next-i18next"; import { SiUbiquiti } from "react-icons/si"; -import classNames from "classnames"; -import Error from "../error"; +import Error from "../widget/error"; +import Container from "../widget/container"; +import Raw from "../widget/raw"; +import WidgetIcon from "../widget/widget_icon"; +import PrimaryText from "../widget/primary_text"; import useWidgetAPI from "utils/proxy/use-widget-api"; @@ -22,21 +25,10 @@ export default function Widget({ options }) { const defaultSite = options.site ? statsData?.data.find(s => s.desc === options.site) : statsData?.data?.find(s => s.name === "default"); if (!defaultSite) { - return ( -
    -
    -
    - -
    -
    - {t("unifi.wait")} -
    -
    -
    - ); + return + {t("unifi.wait")} + + ; } const wan = defaultSite.health.find(h => h.subsystem === "wan"); @@ -51,11 +43,9 @@ export default function Widget({ options }) { const dataEmpty = !(wan.show || lan.show || wlan.show || uptime); - return ( -
    + return + +
    @@ -139,6 +129,7 @@ export default function Widget({ options }) {
    }
    -
    - ); +
    + + } diff --git a/src/components/widgets/weather/weather.jsx b/src/components/widgets/weather/weather.jsx index 51801455..702ea669 100644 --- a/src/components/widgets/weather/weather.jsx +++ b/src/components/widgets/weather/weather.jsx @@ -3,9 +3,13 @@ import { useState } from "react"; import { WiCloudDown } from "react-icons/wi"; import { MdLocationDisabled, MdLocationSearching } from "react-icons/md"; import { useTranslation } from "next-i18next"; -import classNames from "classnames"; -import Error from "../error"; +import Error from "../widget/error"; +import Container from "../widget/container"; +import PrimaryText from "../widget/primary_text"; +import SecondaryText from "../widget/secondary_text"; +import WidgetIcon from "../widget/widget_icon"; +import ContainerButton from "../widget/container_button"; import Icon from "./icon"; @@ -21,49 +25,31 @@ function Widget({ options }) { } if (!data) { - return ( -
    -
    -
    - -
    -
    - {t("weather.updating")} - {t("weather.wait")} -
    -
    -
    - ); + return + {t("weather.updating")} + {t("weather.wait")} + + ; } const unit = options.units === "metric" ? "celsius" : "fahrenheit"; + const weatherInfo = { + condition: data.current.condition.code, + timeOfDay: data.current.is_day ? "day" : "night", + }; - return ( -
    -
    -
    - -
    -
    - - {options.label && `${options.label}, `} - {t("common.number", { - value: options.units === "metric" ? data.current.temp_c : data.current.temp_f, - style: "unit", - unit, - })} - - {data.current.condition.text} -
    -
    -
    - ); + return + + {options.label && `${options.label}, `} + {t("common.number", { + value: options.units === "metric" ? data.current.temp_c : data.current.temp_f, + style: "unit", + unit, + })} + + {data.current.condition.text} + + ; } export default function WeatherApi({ options }) { @@ -95,33 +81,12 @@ export default function WeatherApi({ options }) { } }; - // if (!requesting && !location) requestLocation(); - if (!location) { - return ( - - ); + return + {t("weather.current")} + {t("weather.allow")} + + ; } return ; diff --git a/src/components/widgets/widget.jsx b/src/components/widgets/widget.jsx index 47141887..b4fdb143 100644 --- a/src/components/widgets/widget.jsx +++ b/src/components/widgets/widget.jsx @@ -17,13 +17,13 @@ const widgetMappings = { kubernetes: dynamic(() => import("components/widgets/kubernetes/kubernetes")), }; -export default function Widget({ widget }) { +export default function Widget({ widget, style }) { const InfoWidget = widgetMappings[widget.type]; if (InfoWidget) { return ( - + ); } diff --git a/src/components/widgets/widget/container.jsx b/src/components/widgets/widget/container.jsx new file mode 100644 index 00000000..3a4a9f57 --- /dev/null +++ b/src/components/widgets/widget/container.jsx @@ -0,0 +1,42 @@ +import classNames from "classnames"; + +import WidgetIcon from "./widget_icon"; +import PrimaryText from "./primary_text"; +import SecondaryText from "./secondary_text"; +import Raw from "./raw"; + +export function getAllClasses(options, additionalClassNames = '') { + return classNames( + "flex flex-col justify-center first:ml-0 ml-4 mr-2", + additionalClassNames, + options?.style === "boxedWidgets" && " ml-4 mt-2 m:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-2 pl-3", + ); +} + +export function getInnerBlock(children) { + // children won't be an array if it's Raw component + return Array.isArray(children) &&
    +
    {children.find(child => child.type === WidgetIcon)}
    +
    + {children.find(child => child.type === PrimaryText)} + {children.find(child => child.type === SecondaryText)} +
    +
    ; +} + +export function getBottomBlock(children) { + if (children.type !== Raw) { + return children.find(child => child.type === Raw) || []; + } + + return [children]; +} + +export default function Container({ children = [], options, additionalClassNames = '' }) { + return ( +
    + {getInnerBlock(children)} + {getBottomBlock(children)} +
    + ); +} diff --git a/src/components/widgets/widget/container_button.jsx b/src/components/widgets/widget/container_button.jsx new file mode 100644 index 00000000..92d8a416 --- /dev/null +++ b/src/components/widgets/widget/container_button.jsx @@ -0,0 +1,10 @@ +import { getAllClasses, getInnerBlock, getBottomBlock } from "./container"; + +export default function ContainerButton ({ children = [], options, additionalClassNames = '', callback }) { + return ( + + ); +} diff --git a/src/components/widgets/widget/container_form.jsx b/src/components/widgets/widget/container_form.jsx new file mode 100644 index 00000000..7d28a1bb --- /dev/null +++ b/src/components/widgets/widget/container_form.jsx @@ -0,0 +1,10 @@ +import { getAllClasses, getInnerBlock, getBottomBlock } from "./container"; + +export default function ContainerForm ({ children = [], options, additionalClassNames = '', callback }) { + return ( +
    + {getInnerBlock(children)} + {getBottomBlock(children)} +
    + ); +} diff --git a/src/components/widgets/widget/container_link.jsx b/src/components/widgets/widget/container_link.jsx new file mode 100644 index 00000000..8ef0e80a --- /dev/null +++ b/src/components/widgets/widget/container_link.jsx @@ -0,0 +1,10 @@ +import { getAllClasses, getInnerBlock, getBottomBlock } from "./container"; + +export default function ContainerLink ({ children = [], options, additionalClassNames = '', target }) { + return ( + + {getInnerBlock(children)} + {getBottomBlock(children)} + + ); +} diff --git a/src/components/widgets/widget/error.jsx b/src/components/widgets/widget/error.jsx new file mode 100644 index 00000000..a3dbab85 --- /dev/null +++ b/src/components/widgets/widget/error.jsx @@ -0,0 +1,15 @@ +import { useTranslation } from "react-i18next"; +import { BiError } from "react-icons/bi"; + +import Container from "./container"; +import PrimaryText from "./primary_text"; +import WidgetIcon from "./widget_icon"; + +export default function Error({ options }) { + const { t } = useTranslation(); + + return + {t("widget.api_error")} + + ; +} diff --git a/src/components/widgets/widget/primary_text.jsx b/src/components/widgets/widget/primary_text.jsx new file mode 100644 index 00000000..3418b92c --- /dev/null +++ b/src/components/widgets/widget/primary_text.jsx @@ -0,0 +1,5 @@ +export default function PrimaryText({ children }) { + return ( + {children} + ); +} diff --git a/src/components/widgets/widget/raw.jsx b/src/components/widgets/widget/raw.jsx new file mode 100644 index 00000000..44e3dddc --- /dev/null +++ b/src/components/widgets/widget/raw.jsx @@ -0,0 +1,7 @@ +export default function Raw({ children }) { + if (children.type === Raw) { + return [children]; + } + + return children; +} diff --git a/src/components/widgets/widget/resource_label.jsx b/src/components/widgets/widget/resource_label.jsx new file mode 100644 index 00000000..87f2ad22 --- /dev/null +++ b/src/components/widgets/widget/resource_label.jsx @@ -0,0 +1,5 @@ +export default function ResourceLabel({ children }) { + return ( +
    {children}
    + ); +} diff --git a/src/components/widgets/widget/resource_value.jsx b/src/components/widgets/widget/resource_value.jsx new file mode 100644 index 00000000..8971c748 --- /dev/null +++ b/src/components/widgets/widget/resource_value.jsx @@ -0,0 +1,5 @@ +export default function ResourceValue({ children }) { + return ( +
    {children}
    + ); +} diff --git a/src/components/widgets/widget/resources.jsx b/src/components/widgets/widget/resources.jsx new file mode 100644 index 00000000..0771ec5e --- /dev/null +++ b/src/components/widgets/widget/resources.jsx @@ -0,0 +1,15 @@ +import ContainerLink from "./container_link"; +import SingleResource from "./single_resource"; +import Raw from "./raw"; +import WidgetLabel from "./widget_label"; + +export default function Resources({ options, children, target }) { + return + +
    + {children.filter(child => child && child.type === SingleResource)} +
    + {children.filter(child => child && child.type === WidgetLabel)} +
    +
    ; +} diff --git a/src/components/widgets/widget/secondary_text.jsx b/src/components/widgets/widget/secondary_text.jsx new file mode 100644 index 00000000..363d1bd0 --- /dev/null +++ b/src/components/widgets/widget/secondary_text.jsx @@ -0,0 +1,5 @@ +export default function SecondaryText({ children }) { + return ( + {children} + ); +} diff --git a/src/components/widgets/widget/single_resource.jsx b/src/components/widgets/widget/single_resource.jsx new file mode 100644 index 00000000..7a83d8be --- /dev/null +++ b/src/components/widgets/widget/single_resource.jsx @@ -0,0 +1,28 @@ +import UsageBar from "../resources/usage-bar"; + +import WidgetIcon from "./widget_icon"; +import ResourceValue from "./resource_value"; +import ResourceLabel from "./resource_label"; +import Raw from "./raw"; + +export default function SingleResource({ children, key, expanded = false }) { + const values = children.filter(child => child.type === ResourceValue); + const labels = children.filter(child => child.type === ResourceLabel); + + return
    + {children.find(child => child.type === WidgetIcon)} +
    +
    + {values.pop()} + {labels.pop()} +
    + { expanded &&
    + {values.pop()} + {labels.pop()} +
    + } + {children.find(child => child.type === UsageBar)} +
    + {children.find(child => child.type === Raw)} +
    ; +} diff --git a/src/components/widgets/widget/widget_icon.jsx b/src/components/widgets/widget/widget_icon.jsx new file mode 100644 index 00000000..9766a879 --- /dev/null +++ b/src/components/widgets/widget/widget_icon.jsx @@ -0,0 +1,18 @@ +export default function WidgetIcon({ icon, size = "s", pulse = false, weatherInfo = {} }) { + const Icon = icon; + const { condition, timeOfDay } = weatherInfo; + let additionalClasses = "text-theme-800 dark:text-theme-200 "; + + switch (size) { + case "m": additionalClasses += "w-6 h-6 "; break; + case "l": additionalClasses += "w-8 h-8 "; break; + case "xl": additionalClasses += "w-10 h-10 "; break; + default: additionalClasses += "w-5 h-5 "; + } + + if (pulse) { + additionalClasses += "animate-pulse "; + } + + return ; +} diff --git a/src/components/widgets/widget/widget_label.jsx b/src/components/widgets/widget/widget_label.jsx new file mode 100644 index 00000000..dcb9b9e9 --- /dev/null +++ b/src/components/widgets/widget/widget_label.jsx @@ -0,0 +1,3 @@ +export default function WidgetLabel({ label = "" }) { + return
    {label}
    +} diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 6180ff51..7611aed5 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -160,6 +160,7 @@ const headerStyles = { "m-4 mb-0 sm:m-8 sm:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-3", underlined: "m-4 mb-0 sm:m-8 sm:mb-1 border-b-2 pb-4 border-theme-800 dark:border-theme-200/50", clean: "m-4 mb-0 sm:m-8 sm:mb-0", + boxedWidgets: "m-4 mb-0 sm:m-8 sm:mb-0 sm:mt-1", }; function Home({ initialSettings }) { @@ -208,6 +209,7 @@ function Home({ initialSettings }) { searchProvider = searchProviders[searchWidget.options?.provider]; } } + const headerStyle = initialSettings?.headerStyle || "underlined"; useEffect(() => { function handleKeyDown(e) { @@ -256,7 +258,7 @@ function Home({ initialSettings }) {
    !rightAlignedWidgets.includes(widget.type)) .map((widget, i) => ( - + ))} -
    +
    {widgets .filter((widget) => rightAlignedWidgets.includes(widget.type)) .map((widget, i) => ( - + ))}
    From 6f750dd83cfdfb2c5784811e1c091fa814b68ff4 Mon Sep 17 00:00:00 2001 From: Denis Papec Date: Mon, 5 Jun 2023 23:18:18 +0100 Subject: [PATCH 112/207] Further improvements to simplify information widgets Signed-off-by: Denis Papec --- src/components/widgets/glances/glances.jsx | 130 ++++++++---------- src/components/widgets/longhorn/node.jsx | 25 ++-- src/components/widgets/resources/cpu.jsx | 54 +++----- src/components/widgets/resources/cputemp.jsx | 63 ++++----- src/components/widgets/resources/disk.jsx | 41 +++--- src/components/widgets/resources/memory.jsx | 47 +++---- src/components/widgets/resources/uptime.jsx | 22 +-- src/components/widgets/widget/resource.jsx | 22 +++ .../widgets/widget/resource_label.jsx | 5 - .../widgets/widget/resource_value.jsx | 5 - src/components/widgets/widget/resources.jsx | 6 +- .../widgets/widget/single_resource.jsx | 28 ---- 12 files changed, 181 insertions(+), 267 deletions(-) create mode 100644 src/components/widgets/widget/resource.jsx delete mode 100644 src/components/widgets/widget/resource_label.jsx delete mode 100644 src/components/widgets/widget/resource_value.jsx delete mode 100644 src/components/widgets/widget/single_resource.jsx diff --git a/src/components/widgets/glances/glances.jsx b/src/components/widgets/glances/glances.jsx index debb09c7..b45dfefe 100644 --- a/src/components/widgets/glances/glances.jsx +++ b/src/components/widgets/glances/glances.jsx @@ -4,12 +4,8 @@ import { FaMemory, FaRegClock, FaThermometerHalf } from "react-icons/fa"; import { FiCpu, FiHardDrive } from "react-icons/fi"; import { useTranslation } from "next-i18next"; -import UsageBar from "../resources/usage-bar"; import Error from "../widget/error"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Resources from "../widget/resources"; import WidgetLabel from "../widget/widget_label"; @@ -37,31 +33,11 @@ export default function Widget({ options }) { if (!data) { return - - - {t("glances.wait")} - - - - - {t("glances.wait")} - - - {options.cputemp && - - - {t("glances.wait")} - - - } - {options.uptime && - - - {t("glances.wait")} - - - } - {options.label && } + + + { options.cputemp && } + { options.uptime && } + { options.label && } ; } @@ -93,77 +69,81 @@ export default function Widget({ options }) { return ( - - - {t("common.number", { + - {t("glances.cpu")} - {t("common.number", { + })} + label={t("glances.cpu")} + expandedValue={t("common.number", { value: data.load.min15, style: "unit", unit: "percent", - maximumFractionDigits: 0, - })} - {t("glances.load")} - - - - - {t("common.bytes", { + maximumFractionDigits: 0 + })} + expandedLabel={t("glances.load")} + percentage={data.cpu.total} + expanded={options.expanded} + /> + - {t("glances.free")} - {t("common.bytes", { + })} + label={t("glances.free")} + expandedValue={t("common.bytes", { value: data.mem.total, maximumFractionDigits: 1, binary: true, - })} - {t("glances.total")} - - + })} + expandedLabel={t("glances.total")} + percentage={data.mem.percent} + expanded={options.expanded} + /> {disks.map((disk) => ( - - - {t("common.bytes", { value: disk.free })} - {t("glances.free")} - {t("common.bytes", { value: disk.size })} - {t("glances.total")} - - + ))} {options.cputemp && mainTemp > 0 && - - - {t("common.number", { + - {t("glances.temp")} - {t("common.number", { + })} + label={t("glances.temp")} + expandedValue={t("common.number", { value: maxTemp, maximumFractionDigits: 1, style: "unit", unit - })} - {t("glances.warn")} - - + })} + expandedLabel={t("glances.warn")} + percentage={tempPercent} + expanded={options.expanded} + /> } {options.uptime && data.uptime && - - - {data.uptime.replace(" days,", t("glances.days")).replace(/:\d\d:\d\d$/g, t("glances.hours"))} - {t("glances.uptime")} - - + } {options.label && } diff --git a/src/components/widgets/longhorn/node.jsx b/src/components/widgets/longhorn/node.jsx index 9983486e..5235698a 100644 --- a/src/components/widgets/longhorn/node.jsx +++ b/src/components/widgets/longhorn/node.jsx @@ -1,23 +1,20 @@ import { useTranslation } from "next-i18next"; import { FaThermometerHalf } from "react-icons/fa"; -import UsageBar from "../resources/usage-bar"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import WidgetLabel from "../widget/widget_label"; export default function Node({ data, expanded, labels }) { const { t } = useTranslation(); - return - - {t("common.bytes", { value: data.node.available })} - {t("resources.free")} - {t("common.bytes", { value: data.node.maximum })} - {t("resources.total")} - - { labels && } - + return { labels && } + } diff --git a/src/components/widgets/resources/cpu.jsx b/src/components/widgets/resources/cpu.jsx index 242e7a3d..12972fe8 100644 --- a/src/components/widgets/resources/cpu.jsx +++ b/src/components/widgets/resources/cpu.jsx @@ -2,14 +2,9 @@ import useSWR from "swr"; import { FiCpu } from "react-icons/fi"; import { useTranslation } from "next-i18next"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Error from "../widget/error"; -import UsageBar from "./usage-bar"; - export default function Cpu({ expanded }) { const { t } = useTranslation(); @@ -22,34 +17,25 @@ export default function Cpu({ expanded }) { } if (!data) { - return - - - - {t("resources.cpu")} - - - {t("resources.load")} - - + return } - return - - - {t("common.number", { - value: data.cpu.usage, - style: "unit", - unit: "percent", - maximumFractionDigits: 0, - })} - - {t("resources.cpu")} - - {t("common.number", { - value: data.cpu.load, - maximumFractionDigits: 2, - })} - - {t("resources.load")} - - + return } diff --git a/src/components/widgets/resources/cputemp.jsx b/src/components/widgets/resources/cputemp.jsx index 1a62aa31..ba6d9b73 100644 --- a/src/components/widgets/resources/cputemp.jsx +++ b/src/components/widgets/resources/cputemp.jsx @@ -2,14 +2,9 @@ import useSWR from "swr"; import { FaThermometerHalf } from "react-icons/fa"; import { useTranslation } from "next-i18next"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Error from "../widget/error"; -import UsageBar from "./usage-bar"; - function convertToFahrenheit(t) { return t * 9/5 + 32 } @@ -26,13 +21,14 @@ export default function CpuTemp({ expanded, units }) { } if (!data || !data.cputemp) { - return - - - - {t("resources.temp")} - - - {t("resources.max")} - + return ; } let mainTemp = data.cputemp.main; @@ -43,26 +39,23 @@ export default function CpuTemp({ expanded, units }) { mainTemp = (unit === "celsius") ? mainTemp : convertToFahrenheit(mainTemp); const maxTemp = (unit === "celsius") ? data.cputemp.max : convertToFahrenheit(data.cputemp.max); - return - - - {t("common.number", { - value: mainTemp, - maximumFractionDigits: 1, - style: "unit", - unit - })} - - {t("resources.temp")} - - {t("common.number", { - value: maxTemp, - maximumFractionDigits: 1, - style: "unit", - unit - })} - - {t("resources.max")} - - ; + return ; } diff --git a/src/components/widgets/resources/disk.jsx b/src/components/widgets/resources/disk.jsx index 742ff9d7..ab56624d 100644 --- a/src/components/widgets/resources/disk.jsx +++ b/src/components/widgets/resources/disk.jsx @@ -2,14 +2,9 @@ import useSWR from "swr"; import { FiHardDrive } from "react-icons/fi"; import { useTranslation } from "next-i18next"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Error from "../widget/error"; -import UsageBar from "./usage-bar"; - export default function Disk({ options, expanded }) { const { t } = useTranslation(); @@ -22,25 +17,27 @@ export default function Disk({ options, expanded }) { } if (!data) { - return - - - - {t("resources.free")} - - - {t("resources.total")} - - ; + return ; } // data.drive.used not accurate? const percent = Math.round(((data.drive.size - data.drive.available) / data.drive.size) * 100); - return - - {t("common.bytes", { value: data.drive.available })} - {t("resources.free")} - {t("common.bytes", { value: data.drive.size })} - {t("resources.total")} - - ; + return ; } diff --git a/src/components/widgets/resources/memory.jsx b/src/components/widgets/resources/memory.jsx index 97c74acc..19ae8687 100644 --- a/src/components/widgets/resources/memory.jsx +++ b/src/components/widgets/resources/memory.jsx @@ -2,14 +2,9 @@ import useSWR from "swr"; import { FaMemory } from "react-icons/fa"; import { useTranslation } from "next-i18next"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Error from "../widget/error"; -import UsageBar from "./usage-bar"; - export default function Memory({ expanded }) { const { t } = useTranslation(); @@ -22,30 +17,26 @@ export default function Memory({ expanded }) { } if (!data) { - return - - - - {t("resources.free")} - - - {t("resources.total")} - - ; + return ; } const percent = Math.round((data.memory.active / data.memory.total) * 100); - return - - {t("common.bytes", { value: data.memory.available, maximumFractionDigits: 1, binary: true })} - {t("resources.free")} - - {t("common.bytes", { - value: data.memory.total, - maximumFractionDigits: 1, - binary: true, - })} - - {t("resources.total")} - - ; + return ; } diff --git a/src/components/widgets/resources/uptime.jsx b/src/components/widgets/resources/uptime.jsx index 6cc2b8c5..3984975f 100644 --- a/src/components/widgets/resources/uptime.jsx +++ b/src/components/widgets/resources/uptime.jsx @@ -2,14 +2,9 @@ import useSWR from "swr"; import { FaRegClock } from "react-icons/fa"; import { useTranslation } from "next-i18next"; -import SingleResource from "../widget/single_resource"; -import WidgetIcon from "../widget/widget_icon"; -import ResourceValue from "../widget/resource_value"; -import ResourceLabel from "../widget/resource_label"; +import Resource from "../widget/resource"; import Error from "../widget/error"; -import UsageBar from "./usage-bar"; - export default function Uptime() { const { t } = useTranslation(); @@ -22,11 +17,7 @@ export default function Uptime() { } if (!data) { - return - - - - {t("resources.uptime")} - ; + return ; } const mo = Math.floor(data.uptime / (3600 * 24 * 31)); @@ -39,12 +30,7 @@ export default function Uptime() { else if (d > 0) uptime = `${d}${t("resources.days")} ${h}${t("resources.hours")}`; else uptime = `${h}${t("resources.hours")} ${m}${t("resources.minutes")}`; - const percent = Math.round((new Date().getSeconds() / 60) * 100); + const percent = Math.round((new Date().getSeconds() / 60) * 100).toString(); - return - - {uptime} - {t("resources.uptime")} - - ; + return ; } diff --git a/src/components/widgets/widget/resource.jsx b/src/components/widgets/widget/resource.jsx new file mode 100644 index 00000000..e77bcb5a --- /dev/null +++ b/src/components/widgets/widget/resource.jsx @@ -0,0 +1,22 @@ +import UsageBar from "../resources/usage-bar"; + +export default function Resource({ children, icon, value, label, expandedValue, expandedLabel, percentage, key, expanded = false }) { + const Icon = icon; + + return
    + +
    +
    +
    {value}
    +
    {label}
    +
    + { expanded &&
    +
    {expandedValue}
    +
    {expandedLabel}
    +
    + } + { percentage && } + { children } +
    +
    ; +} diff --git a/src/components/widgets/widget/resource_label.jsx b/src/components/widgets/widget/resource_label.jsx deleted file mode 100644 index 87f2ad22..00000000 --- a/src/components/widgets/widget/resource_label.jsx +++ /dev/null @@ -1,5 +0,0 @@ -export default function ResourceLabel({ children }) { - return ( -
    {children}
    - ); -} diff --git a/src/components/widgets/widget/resource_value.jsx b/src/components/widgets/widget/resource_value.jsx deleted file mode 100644 index 8971c748..00000000 --- a/src/components/widgets/widget/resource_value.jsx +++ /dev/null @@ -1,5 +0,0 @@ -export default function ResourceValue({ children }) { - return ( -
    {children}
    - ); -} diff --git a/src/components/widgets/widget/resources.jsx b/src/components/widgets/widget/resources.jsx index 0771ec5e..19fb021d 100644 --- a/src/components/widgets/widget/resources.jsx +++ b/src/components/widgets/widget/resources.jsx @@ -1,5 +1,5 @@ import ContainerLink from "./container_link"; -import SingleResource from "./single_resource"; +import Resource from "./resource"; import Raw from "./raw"; import WidgetLabel from "./widget_label"; @@ -7,9 +7,9 @@ export default function Resources({ options, children, target }) { return
    - {children.filter(child => child && child.type === SingleResource)} + { children.filter(child => child && child.type === Resource) }
    - {children.filter(child => child && child.type === WidgetLabel)} + { children.filter(child => child && child.type === WidgetLabel) }
    ; } diff --git a/src/components/widgets/widget/single_resource.jsx b/src/components/widgets/widget/single_resource.jsx deleted file mode 100644 index 7a83d8be..00000000 --- a/src/components/widgets/widget/single_resource.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import UsageBar from "../resources/usage-bar"; - -import WidgetIcon from "./widget_icon"; -import ResourceValue from "./resource_value"; -import ResourceLabel from "./resource_label"; -import Raw from "./raw"; - -export default function SingleResource({ children, key, expanded = false }) { - const values = children.filter(child => child.type === ResourceValue); - const labels = children.filter(child => child.type === ResourceLabel); - - return
    - {children.find(child => child.type === WidgetIcon)} -
    -
    - {values.pop()} - {labels.pop()} -
    - { expanded &&
    - {values.pop()} - {labels.pop()} -
    - } - {children.find(child => child.type === UsageBar)} -
    - {children.find(child => child.type === Raw)} -
    ; -} From 1622069063691bebefb37202d3383ddfe81b67fb Mon Sep 17 00:00:00 2001 From: Denis Papec Date: Mon, 12 Jun 2023 00:23:01 +0100 Subject: [PATCH 113/207] Fixes for existing header styles, fix for glances Signed-off-by: Denis Papec --- src/components/widgets/glances/glances.jsx | 2 ++ .../widgets/openweathermap/weather.jsx | 3 +-- src/components/widgets/widget/container.jsx | 22 ++++++++++++++----- src/components/widgets/widget/resource.jsx | 4 ++-- src/components/widgets/widget/resources.jsx | 6 +++-- .../widgets/widget/widget_label.jsx | 2 +- src/pages/index.jsx | 11 ++++++---- 7 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/components/widgets/glances/glances.jsx b/src/components/widgets/glances/glances.jsx index b45dfefe..e5cf3fbd 100644 --- a/src/components/widgets/glances/glances.jsx +++ b/src/components/widgets/glances/glances.jsx @@ -36,6 +36,8 @@ export default function Widget({ options }) { { options.cputemp && } + { options.disk && !Array.isArray(options.disk) && } + { options.disk && Array.isArray(options.disk) && options.disk.map((disk) => )} { options.uptime && } { options.label && } ; diff --git a/src/components/widgets/openweathermap/weather.jsx b/src/components/widgets/openweathermap/weather.jsx index 30531513..a857f13a 100644 --- a/src/components/widgets/openweathermap/weather.jsx +++ b/src/components/widgets/openweathermap/weather.jsx @@ -41,8 +41,7 @@ function Widget({ options }) { }; return - {options.label && `${options.label}, `} - {t("common.number", { value: data.main.temp, style: "unit", unit })} + {options.label && `${options.label}, ` }{t("common.number", { value: data.main.temp, style: "unit", unit })} {data.weather[0].description} ; diff --git a/src/components/widgets/widget/container.jsx b/src/components/widgets/widget/container.jsx index 3a4a9f57..59ea5684 100644 --- a/src/components/widgets/widget/container.jsx +++ b/src/components/widgets/widget/container.jsx @@ -6,10 +6,22 @@ import SecondaryText from "./secondary_text"; import Raw from "./raw"; export function getAllClasses(options, additionalClassNames = '') { + if (options?.style?.header === "boxedWidgets") { + return classNames( + "flex flex-col justify-center first:ml-0 ml-2 mr-2", + "mt-2 m:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-2 pl-3 pr-3", + additionalClassNames + ); + } + + let widgetAlignedClasses = "flex flex-col max-w:full sm:basis-auto self-center grow-0 flex-wrap"; + if (options?.style?.isRightAligned) { + widgetAlignedClasses = "flex flex-col justify-center first:ml-auto ml-2 mr-2 "; + } + return classNames( - "flex flex-col justify-center first:ml-0 ml-4 mr-2", - additionalClassNames, - options?.style === "boxedWidgets" && " ml-4 mt-2 m:mb-0 rounded-md shadow-md shadow-theme-900/10 dark:shadow-theme-900/20 bg-theme-100/20 dark:bg-white/5 p-2 pl-3", + widgetAlignedClasses, + additionalClassNames ); } @@ -18,8 +30,8 @@ export function getInnerBlock(children) { return Array.isArray(children) &&
    {children.find(child => child.type === WidgetIcon)}
    - {children.find(child => child.type === PrimaryText)} - {children.find(child => child.type === SecondaryText)} + {children.find(child => child.type === PrimaryText)} + {children.find(child => child.type === SecondaryText)}
    ; } diff --git a/src/components/widgets/widget/resource.jsx b/src/components/widgets/widget/resource.jsx index e77bcb5a..18e7c800 100644 --- a/src/components/widgets/widget/resource.jsx +++ b/src/components/widgets/widget/resource.jsx @@ -1,9 +1,9 @@ import UsageBar from "../resources/usage-bar"; -export default function Resource({ children, icon, value, label, expandedValue, expandedLabel, percentage, key, expanded = false }) { +export default function Resource({ children, icon, value, label, expandedValue = "", expandedLabel = "", percentage, expanded = false }) { const Icon = icon; - return
    + return
    diff --git a/src/components/widgets/widget/resources.jsx b/src/components/widgets/widget/resources.jsx index 19fb021d..394a3058 100644 --- a/src/components/widgets/widget/resources.jsx +++ b/src/components/widgets/widget/resources.jsx @@ -4,12 +4,14 @@ import Raw from "./raw"; import WidgetLabel from "./widget_label"; export default function Resources({ options, children, target }) { + const widgetParts = [].concat(...children); + return
    - { children.filter(child => child && child.type === Resource) } + { widgetParts.filter(child => child && child.type === Resource) }
    - { children.filter(child => child && child.type === WidgetLabel) } + { widgetParts.filter(child => child && child.type === WidgetLabel) }
    ; } diff --git a/src/components/widgets/widget/widget_label.jsx b/src/components/widgets/widget/widget_label.jsx index dcb9b9e9..5fc6ced0 100644 --- a/src/components/widgets/widget/widget_label.jsx +++ b/src/components/widgets/widget/widget_label.jsx @@ -1,3 +1,3 @@ export default function WidgetLabel({ label = "" }) { - return
    {label}
    + return
    {label}
    } diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 7611aed5..d91a8339 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -274,14 +274,17 @@ function Home({ initialSettings }) { {widgets .filter((widget) => !rightAlignedWidgets.includes(widget.type)) .map((widget, i) => ( - + ))} -
    +
    {widgets .filter((widget) => rightAlignedWidgets.includes(widget.type)) .map((widget, i) => ( - + ))}
    @@ -361,7 +364,7 @@ export default function Wrapper({ initialSettings, fallback }) { style={wrappedStyle} >
    Date: Sun, 11 Jun 2023 20:24:53 +0000 Subject: [PATCH 114/207] Translated using Weblate (Portuguese) Currently translated at 89.2% (415 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/ --- public/locales/pt/common.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index cc6dfe46..ab38ab2f 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -590,12 +590,12 @@ "switches_on": "Interruptores Ligados" }, "freshrss": { - "subscriptions": "Subscriptions", - "unread": "Unread" + "subscriptions": "Assinaturas", + "unread": "Não lida" }, "channelsdvrserver": { "shows": "Shows", - "recordings": "Recordings", + "recordings": "Gravações", "scheduled": "Scheduled", "passes": "Passes" }, @@ -637,16 +637,16 @@ }, "caddy": { "upstreams": "Upstreams", - "requests": "Current requests", - "requests_failed": "Failed requests" + "requests": "Solicitações atuais", + "requests_failed": "Solicitações com falha" }, "evcc": { - "pv_power": "Production", - "battery_soc": "Battery", - "grid_power": "Grid", - "home_power": "Consumption", - "charge_power": "Charger", - "watt_hour": "Wh" + "pv_power": "Produção", + "battery_soc": "Bateria", + "grid_power": "Grade", + "home_power": "Consumo", + "charge_power": "Carregador", + "watt_hour": "Kw" }, "pialert": { "total": "Total", From dcb3dccdc845b810463e71e72cdb0650c217fda8 Mon Sep 17 00:00:00 2001 From: Ado Nishimura Date: Mon, 12 Jun 2023 11:36:26 +0000 Subject: [PATCH 115/207] Translated using Weblate (Japanese) Currently translated at 82.5% (384 of 465 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/ --- public/locales/ja/common.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index ec9b82a9..72d7d8ae 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -63,7 +63,7 @@ "resources": { "cpu": "CPU", "total": "合計", - "free": "フリー", + "free": "Free", "used": "使用", "load": "ロード", "mem": "MEM", @@ -609,11 +609,11 @@ "ago": "{{value}} 前" }, "qnap": { - "cpuUsage": "CPU Usage", - "memUsage": "MEM Usage", - "systemTempC": "System Temp", - "poolUsage": "Pool Usage", - "volumeUsage": "Volume Usage", + "cpuUsage": "CPU使用量", + "memUsage": "MEM使用量", + "systemTempC": "システム温度", + "poolUsage": "プール使用量", + "volumeUsage": "ボリューム使用量", "invalid": "Invalid" }, "pfsense": { @@ -633,11 +633,11 @@ }, "evcc": { "watt_hour": "Wh", - "pv_power": "Production", - "battery_soc": "Battery", - "grid_power": "Grid", - "home_power": "Consumption", - "charge_power": "Charger" + "pv_power": "発電量", + "battery_soc": "バッテリー", + "grid_power": "グリッド", + "home_power": "消費", + "charge_power": "チャージャー" }, "pialert": { "total": "Total", From fce680d981c2dabe48cd4e965bd34f569c2342c9 Mon Sep 17 00:00:00 2001 From: Dan5py Date: Tue, 13 Jun 2023 21:02:06 +0200 Subject: [PATCH 116/207] Fixes #1606 --- src/utils/config/service-helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index d4f7bc4e..fb47951a 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -158,7 +158,7 @@ export async function servicesFromKubernetes() { return null; }); - const traefikIngressList = await crd.listClusterCustomObject("traefik.containo.us", "v1alpha1", "ingressroutes") + const traefikIngressList = await crd.listClusterCustomObject("traefik.io", "v1alpha1", "ingressroutes") .then((response) => response.body) .catch((error) => { logger.error("Error getting traefik ingresses: %d %s %s", error.statusCode, error.body, error.response); From f1d6a990ac0eeb538a853e5965e646ce124522b9 Mon Sep 17 00:00:00 2001 From: Karl Hudgell Date: Tue, 13 Jun 2023 20:30:09 +0100 Subject: [PATCH 117/207] Working Jdownloader --- public/locales/en/common.json | 5 + src/widgets/components.js | 3 +- src/widgets/jdownloader/component.jsx | 37 +++++ src/widgets/jdownloader/proxy.js | 191 ++++++++++++++++++++++++++ src/widgets/jdownloader/tools.js | 55 ++++++++ src/widgets/jdownloader/widget.js | 15 ++ src/widgets/widgets.js | 2 + 7 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 src/widgets/jdownloader/component.jsx create mode 100644 src/widgets/jdownloader/proxy.js create mode 100644 src/widgets/jdownloader/tools.js create mode 100644 src/widgets/jdownloader/widget.js diff --git a/public/locales/en/common.json b/public/locales/en/common.json index c90287da..437088bd 100755 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -653,5 +653,10 @@ "whatsupdocker": { "monitoring": "Monitoring", "updates": "Updates" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } diff --git a/src/widgets/components.js b/src/widgets/components.js index 589a93ad..97760d36 100644 --- a/src/widgets/components.js +++ b/src/widgets/components.js @@ -31,6 +31,7 @@ const components = { healthchecks: dynamic(() => import("./healthchecks/component")), immich: dynamic(() => import("./immich/component")), jackett: dynamic(() => import("./jackett/component")), + jdownloader: dynamic(() => import("./jdownloader/component")), jellyfin: dynamic(() => import("./emby/component")), jellyseerr: dynamic(() => import("./jellyseerr/component")), komga: dynamic(() => import("./komga/component")), @@ -91,4 +92,4 @@ const components = { xteve: dynamic(() => import("./xteve/component")), }; -export default components; +export default components; \ No newline at end of file diff --git a/src/widgets/jdownloader/component.jsx b/src/widgets/jdownloader/component.jsx new file mode 100644 index 00000000..d8fea9ca --- /dev/null +++ b/src/widgets/jdownloader/component.jsx @@ -0,0 +1,37 @@ +import { useTranslation } from "next-i18next"; + +import Block from "components/services/widget/block"; +import Container from "components/services/widget/container"; +import useWidgetAPI from "utils/proxy/use-widget-api"; + +export default function Component({ service }) { + const { t } = useTranslation(); + + const { widget } = service; + + const { data: jdownloaderData, error: jdownloaderAPIError } = useWidgetAPI(widget, "unified", { + refreshInterval: 30000, + }); + + if (jdownloaderAPIError) { + return ; + } + + if (!jdownloaderData) { + return ( + + + + + + ); + } + + return ( + + + + + + ); +} \ No newline at end of file diff --git a/src/widgets/jdownloader/proxy.js b/src/widgets/jdownloader/proxy.js new file mode 100644 index 00000000..353192ac --- /dev/null +++ b/src/widgets/jdownloader/proxy.js @@ -0,0 +1,191 @@ +/* eslint-disable no-underscore-dangle */ +import crypto from 'crypto'; +import querystring from 'querystring'; + +import { sha256, uniqueRid, validateRid, createEncryptionToken, decrypt, encrypt } from "./tools" + +import getServiceWidget from "utils/config/service-helpers"; +import { httpProxy } from "utils/proxy/http"; +import createLogger from "utils/logger"; + +const proxyName = "jdownloaderProxyHandler"; +const logger = createLogger(proxyName); + +async function getWidget(req) { + const { group, service } = req.query; + if (!group || !service) { + logger.debug("Invalid or missing service '%s' or group '%s'", service, group); + return null; + } + const widget = await getServiceWidget(group, service); + if (!widget) { + logger.debug("Invalid or missing widget for service '%s' in group '%s'", service, group); + return null; + } + + return widget; +} + +async function login(loginSecret, deviceSecret, params) { + const rid = uniqueRid(); + const path = `/my/connect?${querystring.stringify({...params, rid})}`; + + const signature = crypto + .createHmac('sha256', loginSecret) + .update(path) + .digest('hex'); + const url = `${new URL(`https://api.jdownloader.org${path}&signature=${signature}`)}` + + const [status, contentType, data] = await httpProxy(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (status !== 200) { + logger.error("HTTP %d communicating with jdownloader. Data: %s", status, data.toString()); + return [status, data]; + } + + try { + const decryptedData = JSON.parse(decrypt(data.toString(), loginSecret)) + const sessionToken = decryptedData.sessiontoken; + validateRid(decryptedData, rid); + const serverEncryptionToken = createEncryptionToken(loginSecret, sessionToken); + const deviceEncryptionToken = createEncryptionToken(deviceSecret, sessionToken); + return [status, decryptedData, contentType, serverEncryptionToken, deviceEncryptionToken, sessionToken]; + } catch (e) { + logger.error("Error decoding jdownloader API data. Data: %s", data.toString()); + return [status, null]; + } +} + + +async function getDevice(serverEncryptionToken, deviceName, params) { + const rid = uniqueRid(); + const path = `/my/listdevices?${querystring.stringify({...params, rid})}`; + const signature = crypto + .createHmac('sha256', serverEncryptionToken) + .update(path) + .digest('hex'); + const url = `${new URL(`https://api.jdownloader.org${path}&signature=${signature}`)}` + + const [status, , data] = await httpProxy(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (status !== 200) { + logger.error("HTTP %d communicating with jdownloader. Data: %s", status, data.toString()); + return [status, data]; + } + + try { + const decryptedData = JSON.parse(decrypt(data.toString(), serverEncryptionToken)) + const filteredDevice = decryptedData.list.filter(device => device.name === deviceName); + return [status, filteredDevice[0].id]; + } catch (e) { + logger.error("Error decoding jdownloader API data. Data: %s", data.toString()); + return [status, null]; + } + +} + +function createBody(rid, query, params) { + const baseBody = { + apiVer: 1, + rid, + url: query + }; + return params ? {...baseBody, params: [JSON.stringify(params)] } : baseBody; +} + +async function queryPackages(deviceEncryptionToken, deviceId, sessionToken, params) { + const rid = uniqueRid(); + const body = encrypt(JSON.stringify(createBody(rid, '/downloadsV2/queryPackages', params)), deviceEncryptionToken); + const url = `${new URL(`https://api.jdownloader.org/t_${encodeURI(sessionToken)}_${encodeURI(deviceId)}/downloadsV2/queryPackages`)}` + const [status, , data] = await httpProxy(url, { + method: 'POST', + body, + }); + + if (status !== 200) { + logger.error("HTTP %d communicating with jdownloader. Data: %s", status, data.toString()); + return [status, data]; + } + + try { + const decryptedData = JSON.parse(decrypt(data.toString(), deviceEncryptionToken)) + return decryptedData.data; + } catch (e) { + logger.error("Error decoding JDRss jdownloader data. Data: %s", data.toString()); + return [status, null]; + } + +} + + +export default async function jdownloaderProxyHandler(req, res) { + const widget = await getWidget(req); + + if (!widget) { + return res.status(400).json({ error: "Invalid proxy service type" }); + } + logger.debug("Getting data from JDRss API"); + const {username} = widget + const {password} = widget + + const appKey = "homepage" + const loginSecret = sha256(`${username}${password}server`) + const deviceSecret = sha256(`${username}${password}device`) + const email = username; + + const loginData = await login(loginSecret, deviceSecret, { + appKey, + email + }) + + const deviceData = await getDevice(loginData[3], widget.client, { + sessiontoken: loginData[5] + }) + + const packageStatus = await queryPackages(loginData[4], deviceData[1], loginData[5], { + "bytesLoaded": false, + "bytesTotal": true, + "comment": false, + "enabled": true, + "eta": false, + "priority": false, + "finished": true, + "running": true, + "speed": true, + "status": true, + "childCount": false, + "hosts": false, + "saveTo": false, + "maxResults": -1, + "startAt": 0, + } + ) + + let totalBytes = 0; + let totalSpeed = 0; + packageStatus.forEach(file => { + totalBytes += file.bytesTotal; + if (file.speed) { + totalSpeed += file.speed; + } + }); + + const data = { + downloadCount: packageStatus.length, + totalBytes, + totalSpeed + }; + + return res.send(data); + +} \ No newline at end of file diff --git a/src/widgets/jdownloader/tools.js b/src/widgets/jdownloader/tools.js new file mode 100644 index 00000000..d678b072 --- /dev/null +++ b/src/widgets/jdownloader/tools.js @@ -0,0 +1,55 @@ +import crypto from 'crypto'; + +export function sha256(data) { + return crypto + .createHash('sha256') + .update(data) + .digest(); +} + +export function uniqueRid() { + return Math.floor(Math.random() * 10e12); +} + +export function validateRid(decryptedData, rid) { + if (decryptedData.rid !== rid) { + throw new Error('RequestID mismatch'); + } + return decryptedData; + +} + +export function decrypt(data, ivKey) { + const iv = ivKey.slice(0, ivKey.length / 2); + const key = ivKey.slice(ivKey.length / 2, ivKey.length); + const cipher = crypto.createDecipheriv('aes-128-cbc', key, iv); + return Buffer.concat([ + cipher.update(data, 'base64'), + cipher.final() + ]).toString(); +} + +export function createEncryptionToken(oldTokenBuff, updateToken) { + const updateTokenBuff = Buffer.from(updateToken, 'hex'); + const mergedBuffer = Buffer.concat([oldTokenBuff, updateTokenBuff], oldTokenBuff.length + updateTokenBuff.length); + return sha256(mergedBuffer); +} + +export function encrypt(data, ivKey) { + if (typeof data !== 'string') { + throw new Error('data no es un string'); + } + if (!(ivKey instanceof Buffer)) { + throw new Error('ivKey no es un buffer'); + } + if (ivKey.length !== 32) { + throw new Error('ivKey tiene que tener tamaño 32'); + } + const stringIVKey = ivKey.toString('hex'); + const stringIV = stringIVKey.substring(0, stringIVKey.length / 2); + const stringKey = stringIVKey.substring(stringIVKey.length / 2, stringIVKey.length); + const iv = Buffer.from(stringIV, 'hex'); + const key = Buffer.from(stringKey, 'hex'); + const cipher = crypto.createCipheriv('aes-128-cbc', key, iv); + return cipher.update(data, 'utf8', 'base64') + cipher.final('base64'); +} \ No newline at end of file diff --git a/src/widgets/jdownloader/widget.js b/src/widgets/jdownloader/widget.js new file mode 100644 index 00000000..acd25d74 --- /dev/null +++ b/src/widgets/jdownloader/widget.js @@ -0,0 +1,15 @@ +import jdownloaderProxyHandler from "./proxy"; + +const widget = { + api: "https://api.jdownloader.org/{endpoint}/&signature={signature}", + proxyHandler: jdownloaderProxyHandler, + + mappings: { + unified: { + endpoint: "/", + signature: "", + }, + }, +}; + +export default widget; \ No newline at end of file diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js index f843a168..86c4266f 100644 --- a/src/widgets/widgets.js +++ b/src/widgets/widgets.js @@ -27,6 +27,7 @@ import healthchecks from "./healthchecks/widget"; import immich from "./immich/widget"; import jackett from "./jackett/widget"; import jellyseerr from "./jellyseerr/widget"; +import jdownloader from "./jdownloader/widget"; import komga from "./komga/widget"; import kopia from "./kopia/widget"; import lidarr from "./lidarr/widget"; @@ -113,6 +114,7 @@ const widgets = { healthchecks, immich, jackett, + jdownloader, jellyfin: emby, jellyseerr, komga, From 4a97fce841aea990b523f6ebb9abd47940d05026 Mon Sep 17 00:00:00 2001 From: Dan5py Date: Tue, 13 Jun 2023 22:04:56 +0200 Subject: [PATCH 118/207] Support old traefik CRD group --- src/utils/config/service-helpers.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index fb47951a..f73a3f3b 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -160,9 +160,18 @@ export async function servicesFromKubernetes() { const traefikIngressList = await crd.listClusterCustomObject("traefik.io", "v1alpha1", "ingressroutes") .then((response) => response.body) - .catch((error) => { - logger.error("Error getting traefik ingresses: %d %s %s", error.statusCode, error.body, error.response); - return null; + .catch(async (error) => { + logger.error("Error getting traefik ingresses from traefik.io: %d %s %s", error.statusCode, error.body, error.response); + + // Fallback to the old traefik CRD group + const fallbackIngressList = await crd.listClusterCustomObject("traefik.containo.us", "v1alpha1", "ingressroutes") + .then((response) => response.body) + .catch((fallbackError) => { + logger.error("Error getting traefik ingresses from traefik.containo.us: %d %s %s", fallbackError.statusCode, fallbackError.body, fallbackError.response); + return null; + }); + + return fallbackIngressList; }); if (traefikIngressList && traefikIngressList.items.length > 0) { From 3ee6650e6d55d5ff78a1b407c05a6db6ebf4911d Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 13 Jun 2023 15:16:49 -0700 Subject: [PATCH 119/207] fix homebridge proxy logging --- src/widgets/homebridge/proxy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/widgets/homebridge/proxy.js b/src/widgets/homebridge/proxy.js index b0a75a03..a9e1ac97 100644 --- a/src/widgets/homebridge/proxy.js +++ b/src/widgets/homebridge/proxy.js @@ -63,7 +63,7 @@ async function apiCall(widget, endpoint, service) { } if (status !== 200) { - logger.error("Error getting data from Homebridge: %s status %d. Data: %s", url, status, data); + logger.error("Error getting data from Homebridge: %s status %d. Data: %s", url, status, JSON.stringify(data)); return { status, contentType, data: null, responseHeaders }; } From abcea88d0a0381db7aaedcd5aaa2444560967df6 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 13 Jun 2023 15:23:19 -0700 Subject: [PATCH 120/207] Try to handle zlib errors --- src/utils/proxy/http.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/utils/proxy/http.js b/src/utils/proxy/http.js index f869cd0b..3c637427 100644 --- a/src/utils/proxy/http.js +++ b/src/utils/proxy/http.js @@ -33,6 +33,13 @@ function handleRequest(requestor, url, params) { const contentEncoding = response.headers['content-encoding']?.trim().toLowerCase(); let responseContent = response; + + // zlib errors + responseContent.on("error", (e) => { + logger.error(e); + responseContent = response; // fallback + }); + if (contentEncoding === 'gzip' || contentEncoding === 'deflate') { responseContent = createUnzip(); response.pipe(responseContent); From b437ccde2fee407b8709106f38b28a13ff1da2c7 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 13 Jun 2023 19:21:12 -0700 Subject: [PATCH 121/207] Another attempt to catch zlib decompression errors --- src/utils/proxy/http.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/utils/proxy/http.js b/src/utils/proxy/http.js index 3c637427..72f65be3 100644 --- a/src/utils/proxy/http.js +++ b/src/utils/proxy/http.js @@ -33,15 +33,13 @@ function handleRequest(requestor, url, params) { const contentEncoding = response.headers['content-encoding']?.trim().toLowerCase(); let responseContent = response; - - // zlib errors - responseContent.on("error", (e) => { - logger.error(e); - responseContent = response; // fallback - }); - if (contentEncoding === 'gzip' || contentEncoding === 'deflate') { responseContent = createUnzip(); + // zlib errors + responseContent.on("error", (e) => { + logger.error(e); + responseContent = response; // fallback + }); response.pipe(responseContent); } From 3f25df954fc3dce6b003b9660c1c604931bef991 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:53 +0000 Subject: [PATCH 122/207] Translated using Weblate (German) Currently translated at 97.6% (457 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/ --- public/locales/de/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/de/common.json b/public/locales/de/common.json index dc06f5d3..76ec612f 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -644,5 +644,10 @@ "connected": "Verbunden", "new_devices": "Neue Geräte", "down_alerts": "Down Alarme" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 250b1a3c53d1293e59042c936c0c2f9cc1c1b951 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:54 +0000 Subject: [PATCH 123/207] Translated using Weblate (Spanish) Currently translated at 99.3% (465 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/ --- public/locales/es/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/es/common.json b/public/locales/es/common.json index 32fa7e6e..c3e0d857 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -644,5 +644,10 @@ "connected": "Conectado", "new_devices": "Nuevos dispositivos", "down_alerts": "Alertas" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 1e7a2cbbc4afc08bee60af9d3e3c5e775a8b1420 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:54 +0000 Subject: [PATCH 124/207] Translated using Weblate (French) Currently translated at 99.3% (465 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/ --- public/locales/fr/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 985f3747..e33601a8 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -644,5 +644,10 @@ "connected": "Connecté", "new_devices": "Nouvel Appareil", "down_alerts": "Alertes" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 28335ca3afcf855adef3e4ab4b538103f23b8a4c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:54 +0000 Subject: [PATCH 125/207] Translated using Weblate (Portuguese) Currently translated at 88.6% (415 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/ --- public/locales/pt/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index ab38ab2f..84b2cc7c 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -653,5 +653,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 8d41834c2a124621b31dc9169ac02aeff1c6c88d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:48 +0000 Subject: [PATCH 126/207] Translated using Weblate (Russian) Currently translated at 88.2% (413 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/ --- public/locales/ru/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index f89313db..8c1e2853 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From a6a9180aa021ca9512ec02fb1ff33ad90d8ba733 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:48 +0000 Subject: [PATCH 127/207] Translated using Weblate (Chinese (Simplified)) Currently translated at 94.6% (443 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/ --- public/locales/zh-CN/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json index 50e36395..beac59df 100644 --- a/public/locales/zh-CN/common.json +++ b/public/locales/zh-CN/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 1582ba94384323b0aaa27ad6d0ca42bf8697b3f7 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:45 +0000 Subject: [PATCH 128/207] Translated using Weblate (Italian) Currently translated at 61.1% (286 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/ --- public/locales/it/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/it/common.json b/public/locales/it/common.json index 2e666af4..ed9a140b 100644 --- a/public/locales/it/common.json +++ b/public/locales/it/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 9a6a580953737d26424037fc042d5aa7d0576bdc Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:45 +0000 Subject: [PATCH 129/207] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 16.8% (79 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/ --- public/locales/nb-NO/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json index cdcda4a8..4bf6b86c 100644 --- a/public/locales/nb-NO/common.json +++ b/public/locales/nb-NO/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 03ba36c59397f43a4623ce3bad9b6f5934ddc4c2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:46 +0000 Subject: [PATCH 130/207] Translated using Weblate (Vietnamese) Currently translated at 9.4% (44 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/ --- public/locales/vi/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index ef39cd2d..71310254 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 368032c931f6a4b2036c5a3114509dfcf9672fc7 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:46 +0000 Subject: [PATCH 131/207] Translated using Weblate (Dutch) Currently translated at 51.4% (241 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/ --- public/locales/nl/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json index 2afed425..087ee1c9 100644 --- a/public/locales/nl/common.json +++ b/public/locales/nl/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 8cc044544ee2ba3db02f7254773ecb299e5013b9 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:50 +0000 Subject: [PATCH 132/207] Translated using Weblate (Chinese (Traditional)) Currently translated at 98.2% (460 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/ --- public/locales/zh-Hant/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json index 75aff10e..c208f0bc 100644 --- a/public/locales/zh-Hant/common.json +++ b/public/locales/zh-Hant/common.json @@ -644,5 +644,10 @@ "connected": "已連線", "new_devices": "新裝置", "down_alerts": "離線警告" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From ae1d7e0866aa01465c790372aaa63bdf3165f4bc Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:47 +0000 Subject: [PATCH 133/207] Translated using Weblate (Catalan) Currently translated at 55.5% (260 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/ --- public/locales/ca/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json index 41391cd5..aaa9f4a5 100644 --- a/public/locales/ca/common.json +++ b/public/locales/ca/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From e0a6a88ba1a46e1c8a5d6854c8bc9914dc64a3cb Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:40 +0000 Subject: [PATCH 134/207] Translated using Weblate (Polish) Currently translated at 79.9% (374 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/ --- public/locales/pl/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index d43f9859..b8f8d997 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From f92c5aa1e3978229a8a7d3a7a3b659849c156ef7 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:47 +0000 Subject: [PATCH 135/207] Translated using Weblate (Swedish) Currently translated at 27.7% (130 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/ --- public/locales/sv/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json index 962a57be..4a67136b 100644 --- a/public/locales/sv/common.json +++ b/public/locales/sv/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From f3176a25ad7b61cab48ed605b39462fbf9d86399 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:49 +0000 Subject: [PATCH 136/207] Translated using Weblate (Croatian) Currently translated at 97.8% (458 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/ --- public/locales/hr/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json index 9a05a55c..e2f2dab6 100644 --- a/public/locales/hr/common.json +++ b/public/locales/hr/common.json @@ -644,5 +644,10 @@ "connected": "Povezano", "new_devices": "Novi uređaji", "down_alerts": "Obavijest o rušenju" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 9d2df383917777262301ca681a58b50de656ccbb Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:52 +0000 Subject: [PATCH 137/207] Translated using Weblate (Hungarian) Currently translated at 22.8% (107 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/ --- public/locales/hu/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json index a8218e73..89d010ba 100644 --- a/public/locales/hu/common.json +++ b/public/locales/hu/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadSpeed": "Download Speed", + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size" } } From 1021e562d8af1fd4b41befd314dd273e733b8546 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:51 +0000 Subject: [PATCH 138/207] Translated using Weblate (Hebrew) Currently translated at 21.3% (100 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/ --- public/locales/he/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/he/common.json b/public/locales/he/common.json index dfe2cb84..b8392aed 100644 --- a/public/locales/he/common.json +++ b/public/locales/he/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 26cff34634c4cd1e34707af26e88e0e94b2ba1bc Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:50 +0000 Subject: [PATCH 139/207] Translated using Weblate (Romanian) Currently translated at 32.0% (150 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/ --- public/locales/ro/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json index 3ca5004e..f0529f63 100644 --- a/public/locales/ro/common.json +++ b/public/locales/ro/common.json @@ -644,5 +644,10 @@ "down_alerts": "Down Alerts", "total": "Total", "connected": "Connected" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 452d36c158626c35e2374dbc7fc3030e69bb28ff Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:49 +0000 Subject: [PATCH 140/207] Translated using Weblate (Portuguese (Brazil)) Currently translated at 86.3% (404 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/ --- public/locales/pt-BR/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json index 716ac875..a0955eac 100644 --- a/public/locales/pt-BR/common.json +++ b/public/locales/pt-BR/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From fd93df77aa5f37343facc3b052492c6ac5036a8f Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:57 +0000 Subject: [PATCH 141/207] Translated using Weblate (Yue (Traditional)) Currently translated at 25.0% (117 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/ --- public/locales/yue/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json index 73e5998b..c3090694 100644 --- a/public/locales/yue/common.json +++ b/public/locales/yue/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From f3a7c1164babf2d7ddc555045b76a3b08f71cdb8 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:55 +0000 Subject: [PATCH 142/207] Translated using Weblate (Finnish) Currently translated at 37.8% (177 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/ --- public/locales/fi/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json index f403b6d4..cb727d6f 100644 --- a/public/locales/fi/common.json +++ b/public/locales/fi/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From a6320bc794a31bbee40d7a694de48b246fbf748c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:55 +0000 Subject: [PATCH 143/207] Translated using Weblate (Telugu) Currently translated at 45.9% (215 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/ --- public/locales/te/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/te/common.json b/public/locales/te/common.json index 3d0deb15..357040b4 100644 --- a/public/locales/te/common.json +++ b/public/locales/te/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 91b828e97cda33b0dfd0d33577f6cd0dea9660d2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:56 +0000 Subject: [PATCH 144/207] Translated using Weblate (Bulgarian) Currently translated at 9.8% (46 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/ --- public/locales/bg/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json index bb6bacbb..25757852 100644 --- a/public/locales/bg/common.json +++ b/public/locales/bg/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From f3708189ef74bfe717753d2b5331d8a67c26f505 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:56 +0000 Subject: [PATCH 145/207] Translated using Weblate (Turkish) Currently translated at 83.9% (393 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/ --- public/locales/tr/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index 09639f67..654d1f74 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -644,5 +644,10 @@ "connected": "Bağlandı", "new_devices": "Yeni Cihazlar", "down_alerts": "Düşme Uyarıları" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 211c723f04f042c4b3bed0ca5a1b7d0d5f09ba5f Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:51 +0000 Subject: [PATCH 146/207] Translated using Weblate (Serbian) Currently translated at 1.9% (9 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/ --- public/locales/sr/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json index 8ce72d5c..77ee5d8e 100644 --- a/public/locales/sr/common.json +++ b/public/locales/sr/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 543573fbdb59d79f7f1a0a83151b95283df755ef Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:51 +0000 Subject: [PATCH 147/207] Translated using Weblate (Arabic) Currently translated at 55.5% (260 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/ --- public/locales/ar/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json index 7f118dc1..c611852a 100644 --- a/public/locales/ar/common.json +++ b/public/locales/ar/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 0f6a4c624c90cf67366214cc2501ec482bbe89a5 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:43 +0000 Subject: [PATCH 148/207] Translated using Weblate (Czech) Currently translated at 94.8% (444 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/ --- public/locales/cs/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json index 940ec67e..690591fb 100644 --- a/public/locales/cs/common.json +++ b/public/locales/cs/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadSpeed": "Download Speed", + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size" } } From 626d636aaecbe5a4ce9e6e689d369f3e554ae512 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:41 +0000 Subject: [PATCH 149/207] Translated using Weblate (Danish) Currently translated at 42.0% (197 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/ --- public/locales/da/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/da/common.json b/public/locales/da/common.json index d1c41aaa..f2fa88e6 100644 --- a/public/locales/da/common.json +++ b/public/locales/da/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadSpeed": "Download Speed", + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size" } } From a8d130d5cb6f1e42c541495bbe2c3fb6bcafe591 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:41 +0000 Subject: [PATCH 150/207] Translated using Weblate (Malay) Currently translated at 53.6% (251 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/ --- public/locales/ms/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json index e249cf43..aaf65d0d 100644 --- a/public/locales/ms/common.json +++ b/public/locales/ms/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 3d19d65cb62ecf96b31d5d3a545840ebdd87e644 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:42 +0000 Subject: [PATCH 151/207] Translated using Weblate (Hindi) Currently translated at 1.9% (9 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/ --- public/locales/hi/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json index 623775c2..f5bf9e2b 100644 --- a/public/locales/hi/common.json +++ b/public/locales/hi/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From d353166b59496f6ed1c74ea03e0f08054eeba06e Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:43 +0000 Subject: [PATCH 152/207] Translated using Weblate (Esperanto) Currently translated at 30.9% (145 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/ --- public/locales/eo/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json index 4ed593be..596aefb3 100644 --- a/public/locales/eo/common.json +++ b/public/locales/eo/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 3d1b18f66029cb599fdb92eafbcfc37f6c595ae6 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:42 +0000 Subject: [PATCH 153/207] Translated using Weblate (Ukrainian) Currently translated at 99.3% (465 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/ --- public/locales/uk/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index 1e1ac9b4..62db97ec 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -644,5 +644,10 @@ "connected": "Підключено", "new_devices": "Нові пристрої", "down_alerts": "Сповіщення про збій" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 3423bbc0ee4275841d4c0afbf7dfc449d464eacd Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:42 +0000 Subject: [PATCH 154/207] Translated using Weblate (Japanese) Currently translated at 82.0% (384 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/ --- public/locales/ja/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index 72d7d8ae..d10e70e1 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From fb7f32589bb5d3e32634446cb90cc683fac6ff91 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:44 +0000 Subject: [PATCH 155/207] Translated using Weblate (Latvian) Currently translated at 25.2% (118 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/ --- public/locales/lv/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/lv/common.json b/public/locales/lv/common.json index d8d63388..47d619dd 100644 --- a/public/locales/lv/common.json +++ b/public/locales/lv/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From f00e26f7ab754cbc6ab4b6b4453414c19ef4e26e Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:38 +0000 Subject: [PATCH 156/207] Translated using Weblate (Thai) Currently translated at 10.0% (47 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/ --- public/locales/th/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/th/common.json b/public/locales/th/common.json index 3981f0f8..d77b8c32 100644 --- a/public/locales/th/common.json +++ b/public/locales/th/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 622255d2eca47a88cd401dfc6895db5f960c9726 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:52 +0000 Subject: [PATCH 157/207] Translated using Weblate (Slovak) Currently translated at 1.9% (9 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/ --- public/locales/sk/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index ee08f212..5826ee4c 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From dbfa14cb51300713a1ce923c8770faee27950e46 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:53 +0000 Subject: [PATCH 158/207] Translated using Weblate (Korean) Currently translated at 36.9% (173 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/ --- public/locales/ko/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json index 6a58072f..456953a8 100644 --- a/public/locales/ko/common.json +++ b/public/locales/ko/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "down_alerts": "Down Alerts", "new_devices": "New Devices" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From c5b044d196bf4606ecb79343d6ec0e717d203979 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:39 +0000 Subject: [PATCH 159/207] Translated using Weblate (Greek) Currently translated at 30.5% (143 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/ --- public/locales/el/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/el/common.json b/public/locales/el/common.json index 3492bdd1..ab26247c 100644 --- a/public/locales/el/common.json +++ b/public/locales/el/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 315bda6ba1cb0c191eeee05c0f7d41a4860df6b4 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:44 +0000 Subject: [PATCH 160/207] Translated using Weblate (Slovenian) Currently translated at 95.9% (449 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/ --- public/locales/sl/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/sl/common.json b/public/locales/sl/common.json index fe5fe631..ef4e4109 100644 --- a/public/locales/sl/common.json +++ b/public/locales/sl/common.json @@ -644,5 +644,10 @@ "connected": "Connected", "new_devices": "New Devices", "down_alerts": "Down Alerts" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 2807575283c6ad8958a48f0629c1ebc5315e4f41 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Wed, 14 Jun 2023 03:46:40 +0000 Subject: [PATCH 161/207] Translated using Weblate (Indonesian) Currently translated at 3.2% (15 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/ --- public/locales/id/common.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/locales/id/common.json b/public/locales/id/common.json index d54218c4..c0bb65d1 100644 --- a/public/locales/id/common.json +++ b/public/locales/id/common.json @@ -644,5 +644,10 @@ "transcoding": "Transcoding", "bitrate": "Bitrate", "no_active": "No Active Streams" + }, + "jdownloader": { + "downloadCount": "Queue Count", + "downloadQueueSize": "Queue Size", + "downloadSpeed": "Download Speed" } } From 35499cffbcc256606e6a619d233535935b12613d Mon Sep 17 00:00:00 2001 From: gallegonovato Date: Wed, 14 Jun 2023 08:44:12 +0000 Subject: [PATCH 162/207] Translated using Weblate (Spanish) Currently translated at 100.0% (468 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/ --- public/locales/es/common.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/locales/es/common.json b/public/locales/es/common.json index c3e0d857..63e1c4a9 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -646,8 +646,8 @@ "down_alerts": "Alertas" }, "jdownloader": { - "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", - "downloadSpeed": "Download Speed" + "downloadCount": "Recuento de las colas", + "downloadQueueSize": "Tamaño de la cola", + "downloadSpeed": "Velocidad de Descarga" } } From 211c694e4e57ff066e2d361967b1bfbbf9b68bb1 Mon Sep 17 00:00:00 2001 From: Nonoss117 Date: Wed, 14 Jun 2023 05:10:59 +0000 Subject: [PATCH 163/207] Translated using Weblate (French) Currently translated at 100.0% (468 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/ --- public/locales/fr/common.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index e33601a8..6d38c3be 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -646,8 +646,8 @@ "down_alerts": "Alertes" }, "jdownloader": { - "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", - "downloadSpeed": "Download Speed" + "downloadCount": "Total en attente", + "downloadQueueSize": "Volume en attente", + "downloadSpeed": "Vitesse de téléchargement" } } From 19918ef68b67f8af18a3dd2c975d4814ada9f346 Mon Sep 17 00:00:00 2001 From: Ali Date: Thu, 15 Jun 2023 04:10:12 +0000 Subject: [PATCH 164/207] Translated using Weblate (Arabic) Currently translated at 55.9% (262 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/ --- public/locales/ar/common.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json index c611852a..a4bf37e0 100644 --- a/public/locales/ar/common.json +++ b/public/locales/ar/common.json @@ -23,7 +23,7 @@ "free": "متاح", "used": "مستخدم", "load": "الضغط", - "mem": "MEM", + "mem": "الذاكرة", "temp": "TEMP", "max": "Max", "uptime": "UP", @@ -134,7 +134,7 @@ "episodes": "Episodes" }, "changedetectionio": { - "totalObserved": "Total Observed", + "totalObserved": "مجموع الملاحظات", "diffsDetected": "Diffs Detected" }, "tautulli": { From af00e44550eeaa8d187009c948c301b8e2825822 Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 14 Jun 2023 08:43:36 +0000 Subject: [PATCH 165/207] Translated using Weblate (Ukrainian) Currently translated at 100.0% (468 of 468 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/ --- public/locales/uk/common.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index 62db97ec..9a204231 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -646,8 +646,8 @@ "down_alerts": "Сповіщення про збій" }, "jdownloader": { - "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", - "downloadSpeed": "Download Speed" + "downloadCount": "Всього в черзі", + "downloadQueueSize": "Розмір черги", + "downloadSpeed": "Швидкість завантаження" } } From 8df11acbe84d7b95ab54c31fcfce5da26355d9bb Mon Sep 17 00:00:00 2001 From: Karl0ss Date: Fri, 16 Jun 2023 07:40:10 +0100 Subject: [PATCH 166/207] JDownloader Widget - Add Total Queue and Remaining In Queue (#1612) undefined --- public/locales/en/common.json | 7 ++++--- src/widgets/jdownloader/component.jsx | 6 ++++-- src/widgets/jdownloader/proxy.js | 23 ++++++++++++++--------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 437088bd..36b5a391 100755 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -655,8 +655,9 @@ "updates": "Updates" }, "jdownloader": { - "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", - "downloadSpeed": "Download Speed" + "downloadCount": "Queue", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size", + "downloadSpeed": "Speed" } } diff --git a/src/widgets/jdownloader/component.jsx b/src/widgets/jdownloader/component.jsx index d8fea9ca..8f271935 100644 --- a/src/widgets/jdownloader/component.jsx +++ b/src/widgets/jdownloader/component.jsx @@ -21,7 +21,8 @@ export default function Component({ service }) { return ( - + + ); @@ -30,7 +31,8 @@ export default function Component({ service }) { return ( - + + ); diff --git a/src/widgets/jdownloader/proxy.js b/src/widgets/jdownloader/proxy.js index 353192ac..be858d51 100644 --- a/src/widgets/jdownloader/proxy.js +++ b/src/widgets/jdownloader/proxy.js @@ -28,8 +28,8 @@ async function getWidget(req) { async function login(loginSecret, deviceSecret, params) { const rid = uniqueRid(); - const path = `/my/connect?${querystring.stringify({...params, rid})}`; - + const path = `/my/connect?${querystring.stringify({ ...params, rid })}`; + const signature = crypto .createHmac('sha256', loginSecret) .update(path) @@ -64,7 +64,7 @@ async function login(loginSecret, deviceSecret, params) { async function getDevice(serverEncryptionToken, deviceName, params) { const rid = uniqueRid(); - const path = `/my/listdevices?${querystring.stringify({...params, rid})}`; + const path = `/my/listdevices?${querystring.stringify({ ...params, rid })}`; const signature = crypto .createHmac('sha256', serverEncryptionToken) .update(path) @@ -100,7 +100,7 @@ function createBody(rid, query, params) { rid, url: query }; - return params ? {...baseBody, params: [JSON.stringify(params)] } : baseBody; + return params ? { ...baseBody, params: [JSON.stringify(params)] } : baseBody; } async function queryPackages(deviceEncryptionToken, deviceId, sessionToken, params) { @@ -135,9 +135,9 @@ export default async function jdownloaderProxyHandler(req, res) { return res.status(400).json({ error: "Invalid proxy service type" }); } logger.debug("Getting data from JDRss API"); - const {username} = widget - const {password} = widget - + const { username } = widget + const { password } = widget + const appKey = "homepage" const loginSecret = sha256(`${username}${password}server`) const deviceSecret = sha256(`${username}${password}device`) @@ -171,17 +171,22 @@ export default async function jdownloaderProxyHandler(req, res) { } ) + let bytesRemaining = 0; let totalBytes = 0; let totalSpeed = 0; packageStatus.forEach(file => { totalBytes += file.bytesTotal; - if (file.speed) { - totalSpeed += file.speed; + if (file.finished !== true) { + bytesRemaining += file.bytesTotal; + if (file.speed) { + totalSpeed += file.speed; + } } }); const data = { downloadCount: packageStatus.length, + bytesRemaining, totalBytes, totalSpeed }; From 079f8d13b548749e988ed1a249dff718d30502ff Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 16 Jun 2023 08:40:19 +0200 Subject: [PATCH 167/207] Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ --- public/locales/ar/common.json | 1 - public/locales/bg/common.json | 1 - public/locales/ca/common.json | 1 - public/locales/cs/common.json | 3 +-- public/locales/da/common.json | 3 +-- public/locales/de/common.json | 1 - public/locales/el/common.json | 1 - public/locales/eo/common.json | 1 - public/locales/es/common.json | 1 - public/locales/fi/common.json | 1 - public/locales/fr/common.json | 1 - public/locales/he/common.json | 1 - public/locales/hi/common.json | 1 - public/locales/hr/common.json | 1 - public/locales/hu/common.json | 3 +-- public/locales/id/common.json | 1 - public/locales/it/common.json | 1 - public/locales/ja/common.json | 1 - public/locales/ko/common.json | 1 - public/locales/lv/common.json | 1 - public/locales/ms/common.json | 1 - public/locales/nb-NO/common.json | 1 - public/locales/nl/common.json | 1 - public/locales/pl/common.json | 1 - public/locales/pt-BR/common.json | 1 - public/locales/pt/common.json | 1 - public/locales/ro/common.json | 1 - public/locales/ru/common.json | 1 - public/locales/sk/common.json | 1 - public/locales/sl/common.json | 1 - public/locales/sr/common.json | 1 - public/locales/sv/common.json | 1 - public/locales/te/common.json | 1 - public/locales/th/common.json | 1 - public/locales/tr/common.json | 1 - public/locales/uk/common.json | 1 - public/locales/vi/common.json | 1 - public/locales/yue/common.json | 1 - public/locales/zh-CN/common.json | 1 - public/locales/zh-Hant/common.json | 1 - 40 files changed, 3 insertions(+), 43 deletions(-) diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json index a4bf37e0..3aa9e275 100644 --- a/public/locales/ar/common.json +++ b/public/locales/ar/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json index 25757852..2a49284a 100644 --- a/public/locales/bg/common.json +++ b/public/locales/bg/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json index aaa9f4a5..8af5461a 100644 --- a/public/locales/ca/common.json +++ b/public/locales/ca/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json index 690591fb..0fae3602 100644 --- a/public/locales/cs/common.json +++ b/public/locales/cs/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadSpeed": "Download Speed", - "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size" + "downloadCount": "Queue Count" } } diff --git a/public/locales/da/common.json b/public/locales/da/common.json index f2fa88e6..b2e581db 100644 --- a/public/locales/da/common.json +++ b/public/locales/da/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadSpeed": "Download Speed", - "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size" + "downloadCount": "Queue Count" } } diff --git a/public/locales/de/common.json b/public/locales/de/common.json index 76ec612f..768d08bb 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/el/common.json b/public/locales/el/common.json index ab26247c..83ec0eee 100644 --- a/public/locales/el/common.json +++ b/public/locales/el/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json index 596aefb3..560f357a 100644 --- a/public/locales/eo/common.json +++ b/public/locales/eo/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/es/common.json b/public/locales/es/common.json index 63e1c4a9..7f791f4d 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Recuento de las colas", - "downloadQueueSize": "Tamaño de la cola", "downloadSpeed": "Velocidad de Descarga" } } diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json index cb727d6f..415fe72c 100644 --- a/public/locales/fi/common.json +++ b/public/locales/fi/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 6d38c3be..10bbda37 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Total en attente", - "downloadQueueSize": "Volume en attente", "downloadSpeed": "Vitesse de téléchargement" } } diff --git a/public/locales/he/common.json b/public/locales/he/common.json index b8392aed..6aabbeee 100644 --- a/public/locales/he/common.json +++ b/public/locales/he/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json index f5bf9e2b..5f36dac2 100644 --- a/public/locales/hi/common.json +++ b/public/locales/hi/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json index e2f2dab6..d4eec5f8 100644 --- a/public/locales/hr/common.json +++ b/public/locales/hr/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json index 89d010ba..06f0681c 100644 --- a/public/locales/hu/common.json +++ b/public/locales/hu/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadSpeed": "Download Speed", - "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size" + "downloadCount": "Queue Count" } } diff --git a/public/locales/id/common.json b/public/locales/id/common.json index c0bb65d1..7f02801e 100644 --- a/public/locales/id/common.json +++ b/public/locales/id/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/it/common.json b/public/locales/it/common.json index ed9a140b..d6160274 100644 --- a/public/locales/it/common.json +++ b/public/locales/it/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index d10e70e1..b124a4e9 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json index 456953a8..02e55749 100644 --- a/public/locales/ko/common.json +++ b/public/locales/ko/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/lv/common.json b/public/locales/lv/common.json index 47d619dd..0bae0316 100644 --- a/public/locales/lv/common.json +++ b/public/locales/lv/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json index aaf65d0d..875fe57e 100644 --- a/public/locales/ms/common.json +++ b/public/locales/ms/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json index 4bf6b86c..12ca26f4 100644 --- a/public/locales/nb-NO/common.json +++ b/public/locales/nb-NO/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json index 087ee1c9..e539de08 100644 --- a/public/locales/nl/common.json +++ b/public/locales/nl/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index b8f8d997..d3e427e4 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json index a0955eac..ff1dc9da 100644 --- a/public/locales/pt-BR/common.json +++ b/public/locales/pt-BR/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index 84b2cc7c..5fa15e57 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -656,7 +656,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json index f0529f63..80e1f992 100644 --- a/public/locales/ro/common.json +++ b/public/locales/ro/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index 8c1e2853..de99ecd2 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index 5826ee4c..193296ac 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/sl/common.json b/public/locales/sl/common.json index ef4e4109..174ca1e4 100644 --- a/public/locales/sl/common.json +++ b/public/locales/sl/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json index 77ee5d8e..de1f5dbb 100644 --- a/public/locales/sr/common.json +++ b/public/locales/sr/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json index 4a67136b..b1b79aa6 100644 --- a/public/locales/sv/common.json +++ b/public/locales/sv/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/te/common.json b/public/locales/te/common.json index 357040b4..894efd45 100644 --- a/public/locales/te/common.json +++ b/public/locales/te/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/th/common.json b/public/locales/th/common.json index d77b8c32..77677426 100644 --- a/public/locales/th/common.json +++ b/public/locales/th/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index 654d1f74..1a6eb114 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index 9a204231..ba896e04 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Всього в черзі", - "downloadQueueSize": "Розмір черги", "downloadSpeed": "Швидкість завантаження" } } diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index 71310254..6606a6b1 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json index c3090694..9fa0fd68 100644 --- a/public/locales/yue/common.json +++ b/public/locales/yue/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json index beac59df..490b572f 100644 --- a/public/locales/zh-CN/common.json +++ b/public/locales/zh-CN/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json index c208f0bc..dfcd4fca 100644 --- a/public/locales/zh-Hant/common.json +++ b/public/locales/zh-Hant/common.json @@ -647,7 +647,6 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadQueueSize": "Queue Size", "downloadSpeed": "Download Speed" } } From c29c92dafb2cd9bffcb108e289200869e8292026 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:22 +0000 Subject: [PATCH 168/207] Translated using Weblate (German) Currently translated at 97.4% (457 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/ --- public/locales/de/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/de/common.json b/public/locales/de/common.json index 768d08bb..521e2cec 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From af2cf436394c0e7425d13fd5470d54cef3953bf0 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:23 +0000 Subject: [PATCH 169/207] Translated using Weblate (Spanish) Currently translated at 99.1% (465 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/ --- public/locales/es/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/es/common.json b/public/locales/es/common.json index 7f791f4d..91c48ce1 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Recuento de las colas", - "downloadSpeed": "Velocidad de Descarga" + "downloadSpeed": "Velocidad de Descarga", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 98b4682bfe9926f127dec101abf0bf07b46e3b11 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:23 +0000 Subject: [PATCH 170/207] Translated using Weblate (French) Currently translated at 99.1% (465 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/ --- public/locales/fr/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index 10bbda37..43b44d45 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Total en attente", - "downloadSpeed": "Vitesse de téléchargement" + "downloadSpeed": "Vitesse de téléchargement", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 4abdce068ec046f303dfda2e5075ba8c21f38623 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:23 +0000 Subject: [PATCH 171/207] Translated using Weblate (Portuguese) Currently translated at 88.4% (415 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/ --- public/locales/pt/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index 5fa15e57..5c84e6c5 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -656,6 +656,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 91d359d5e666b5f2d9d569dd7257e55ec8e60c9e Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:18 +0000 Subject: [PATCH 172/207] Translated using Weblate (Russian) Currently translated at 88.0% (413 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/ --- public/locales/ru/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index de99ecd2..d3cd6d48 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From d2c123e031751db18584ca782983fcb9137a6663 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:18 +0000 Subject: [PATCH 173/207] Translated using Weblate (Chinese (Simplified)) Currently translated at 94.4% (443 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/ --- public/locales/zh-CN/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json index 490b572f..a1f0dfda 100644 --- a/public/locales/zh-CN/common.json +++ b/public/locales/zh-CN/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 2319a6ffb7a6f330720f99d6e8800332aa5ce59a Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:16 +0000 Subject: [PATCH 174/207] Translated using Weblate (Italian) Currently translated at 60.9% (286 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/ --- public/locales/it/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/it/common.json b/public/locales/it/common.json index d6160274..68aaa2f5 100644 --- a/public/locales/it/common.json +++ b/public/locales/it/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From fe3f7ffdf32b87ab56c090f2a9f620377e1cd9e1 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:16 +0000 Subject: [PATCH 175/207] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 16.8% (79 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/ --- public/locales/nb-NO/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json index 12ca26f4..79124218 100644 --- a/public/locales/nb-NO/common.json +++ b/public/locales/nb-NO/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 3065d95765cb5810460c4e029f56fb9629bf7f0c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:17 +0000 Subject: [PATCH 176/207] Translated using Weblate (Vietnamese) Currently translated at 9.3% (44 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/ --- public/locales/vi/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index 6606a6b1..069eaff2 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 4b4b871181e584e5f42b4844e8734901bd6501a4 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:17 +0000 Subject: [PATCH 177/207] Translated using Weblate (Dutch) Currently translated at 51.3% (241 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/ --- public/locales/nl/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json index e539de08..139e9051 100644 --- a/public/locales/nl/common.json +++ b/public/locales/nl/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From af9bca282d2320f4cea99d9aa7db9eb26b1825c3 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:20 +0000 Subject: [PATCH 178/207] Translated using Weblate (Chinese (Traditional)) Currently translated at 98.0% (460 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/ --- public/locales/zh-Hant/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json index dfcd4fca..7c0cb9fe 100644 --- a/public/locales/zh-Hant/common.json +++ b/public/locales/zh-Hant/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From e4212074fefc830cc88534301222234c8413521c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:17 +0000 Subject: [PATCH 179/207] Translated using Weblate (Catalan) Currently translated at 55.4% (260 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/ --- public/locales/ca/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json index 8af5461a..3842feec 100644 --- a/public/locales/ca/common.json +++ b/public/locales/ca/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 634077b5b679af0734ecd2c255c3aec9200438dc Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:12 +0000 Subject: [PATCH 180/207] Translated using Weblate (Polish) Currently translated at 79.7% (374 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/ --- public/locales/pl/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index d3e427e4..6af51828 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 80c93a4e8318e1c4bcfdc31f517ee86095104652 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:18 +0000 Subject: [PATCH 181/207] Translated using Weblate (Swedish) Currently translated at 27.7% (130 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/ --- public/locales/sv/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json index b1b79aa6..c3325844 100644 --- a/public/locales/sv/common.json +++ b/public/locales/sv/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From ce5b8c1c91753a5e7d9e324a765dcc112d393373 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:19 +0000 Subject: [PATCH 182/207] Translated using Weblate (Croatian) Currently translated at 97.6% (458 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/ --- public/locales/hr/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json index d4eec5f8..94dfae26 100644 --- a/public/locales/hr/common.json +++ b/public/locales/hr/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From dcdc93cf06be4d05119b36aa7bc0053375544029 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:21 +0000 Subject: [PATCH 183/207] Translated using Weblate (Hungarian) Currently translated at 22.8% (107 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/ --- public/locales/hu/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json index 06f0681c..016a54d8 100644 --- a/public/locales/hu/common.json +++ b/public/locales/hu/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadSpeed": "Download Speed", - "downloadCount": "Queue Count" + "downloadCount": "Queue Count", + "downloadTotalBytes": "Size", + "downloadBytesRemaining": "Remaining" } } From 2260d250d612a0c9f3952c06fcd5d2a0c19c03a0 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:21 +0000 Subject: [PATCH 184/207] Translated using Weblate (Hebrew) Currently translated at 21.3% (100 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/ --- public/locales/he/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/he/common.json b/public/locales/he/common.json index 6aabbeee..41e5746b 100644 --- a/public/locales/he/common.json +++ b/public/locales/he/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 6488e786e1efb66237f45b37fff1c46d0d4277a4 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:19 +0000 Subject: [PATCH 185/207] Translated using Weblate (Romanian) Currently translated at 31.9% (150 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/ --- public/locales/ro/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json index 80e1f992..e8bf9ac7 100644 --- a/public/locales/ro/common.json +++ b/public/locales/ro/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From cf55092ba6df4ace1e71cb0f378f649ba47c4ae4 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:19 +0000 Subject: [PATCH 186/207] Translated using Weblate (Portuguese (Brazil)) Currently translated at 86.1% (404 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/ --- public/locales/pt-BR/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json index ff1dc9da..d2146d2c 100644 --- a/public/locales/pt-BR/common.json +++ b/public/locales/pt-BR/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 853e741bfa0ce64d75eefbb438a88470f88acc2b Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:25 +0000 Subject: [PATCH 187/207] Translated using Weblate (Yue (Traditional)) Currently translated at 24.9% (117 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue_Hant/ --- public/locales/yue/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json index 9fa0fd68..4e360b26 100644 --- a/public/locales/yue/common.json +++ b/public/locales/yue/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 444ef3f48b704b3c4a1a5237a53cf1ebdcf9a135 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:24 +0000 Subject: [PATCH 188/207] Translated using Weblate (Finnish) Currently translated at 37.7% (177 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/ --- public/locales/fi/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json index 415fe72c..c3875b21 100644 --- a/public/locales/fi/common.json +++ b/public/locales/fi/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From bb2083b2ec5a319aecc2be2b97371fa646ed82d4 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:24 +0000 Subject: [PATCH 189/207] Translated using Weblate (Telugu) Currently translated at 45.8% (215 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/ --- public/locales/te/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/te/common.json b/public/locales/te/common.json index 894efd45..b7d11223 100644 --- a/public/locales/te/common.json +++ b/public/locales/te/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 283a52f843e4bf5480803b77531573fa64b755cb Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:25 +0000 Subject: [PATCH 190/207] Translated using Weblate (Bulgarian) Currently translated at 9.8% (46 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/ --- public/locales/bg/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json index 2a49284a..35dd13f4 100644 --- a/public/locales/bg/common.json +++ b/public/locales/bg/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From c4a7ac9dc60582b8b849ac16ecfb16f1e9f5a3d4 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:25 +0000 Subject: [PATCH 191/207] Translated using Weblate (Turkish) Currently translated at 83.7% (393 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/ --- public/locales/tr/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index 1a6eb114..b152e0f7 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 4a08aee090393803aa706c6fcd4c06c98050beba Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:20 +0000 Subject: [PATCH 192/207] Translated using Weblate (Serbian) Currently translated at 1.9% (9 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/ --- public/locales/sr/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json index de1f5dbb..9ef56193 100644 --- a/public/locales/sr/common.json +++ b/public/locales/sr/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From b506558754ac2a86055ee195311181735fad113c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:21 +0000 Subject: [PATCH 193/207] Translated using Weblate (Arabic) Currently translated at 55.8% (262 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ar/ --- public/locales/ar/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/ar/common.json b/public/locales/ar/common.json index 3aa9e275..a1bf5578 100644 --- a/public/locales/ar/common.json +++ b/public/locales/ar/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 1184b5a2b9286e6d1a60c337f810f56a714759bd Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:14 +0000 Subject: [PATCH 194/207] Translated using Weblate (Czech) Currently translated at 94.6% (444 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/cs/ --- public/locales/cs/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/cs/common.json b/public/locales/cs/common.json index 0fae3602..4e16a37a 100644 --- a/public/locales/cs/common.json +++ b/public/locales/cs/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadSpeed": "Download Speed", - "downloadCount": "Queue Count" + "downloadCount": "Queue Count", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From d6c68415d15b2482d6ca1bcf41025cf208fdd3b8 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:13 +0000 Subject: [PATCH 195/207] Translated using Weblate (Danish) Currently translated at 42.0% (197 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/da/ --- public/locales/da/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/da/common.json b/public/locales/da/common.json index b2e581db..76ff86dd 100644 --- a/public/locales/da/common.json +++ b/public/locales/da/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadSpeed": "Download Speed", - "downloadCount": "Queue Count" + "downloadCount": "Queue Count", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 384164217829bab5bdb7f8777da567661ca1bf43 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:13 +0000 Subject: [PATCH 196/207] Translated using Weblate (Malay) Currently translated at 53.5% (251 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ms/ --- public/locales/ms/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/ms/common.json b/public/locales/ms/common.json index 875fe57e..70fd66e3 100644 --- a/public/locales/ms/common.json +++ b/public/locales/ms/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 904b0d3d6232ebdb9e82f06ab69393f105fa88eb Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:13 +0000 Subject: [PATCH 197/207] Translated using Weblate (Hindi) Currently translated at 1.9% (9 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hi/ --- public/locales/hi/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/hi/common.json b/public/locales/hi/common.json index 5f36dac2..155235a9 100644 --- a/public/locales/hi/common.json +++ b/public/locales/hi/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 99258653852926a0188fc92b17367c74062ba632 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:14 +0000 Subject: [PATCH 198/207] Translated using Weblate (Esperanto) Currently translated at 30.9% (145 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/eo/ --- public/locales/eo/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/eo/common.json b/public/locales/eo/common.json index 560f357a..908169cb 100644 --- a/public/locales/eo/common.json +++ b/public/locales/eo/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 39e30e87d7b1d15854129e16b20663601d90f39d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:15 +0000 Subject: [PATCH 199/207] Translated using Weblate (Ukrainian) Currently translated at 99.1% (465 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/uk/ --- public/locales/uk/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/uk/common.json b/public/locales/uk/common.json index ba896e04..1abd398d 100644 --- a/public/locales/uk/common.json +++ b/public/locales/uk/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Всього в черзі", - "downloadSpeed": "Швидкість завантаження" + "downloadSpeed": "Швидкість завантаження", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 3f8553ce7fe604456597d8443a96504c0e846e41 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:14 +0000 Subject: [PATCH 200/207] Translated using Weblate (Japanese) Currently translated at 81.8% (384 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ja/ --- public/locales/ja/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/ja/common.json b/public/locales/ja/common.json index b124a4e9..1bc37e96 100644 --- a/public/locales/ja/common.json +++ b/public/locales/ja/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 62026cfe9c596d71a48457602155cdf060b119f0 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:15 +0000 Subject: [PATCH 201/207] Translated using Weblate (Latvian) Currently translated at 25.1% (118 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/lv/ --- public/locales/lv/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/lv/common.json b/public/locales/lv/common.json index 0bae0316..70361ee2 100644 --- a/public/locales/lv/common.json +++ b/public/locales/lv/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From f8e2e4bf796c7cd87fa865673b82cce2ee296440 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:11 +0000 Subject: [PATCH 202/207] Translated using Weblate (Thai) Currently translated at 10.0% (47 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/th/ --- public/locales/th/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/th/common.json b/public/locales/th/common.json index 77677426..2afb51f2 100644 --- a/public/locales/th/common.json +++ b/public/locales/th/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 3f60fff12d8bbf9fd6f8e2c63917cc771a300472 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:22 +0000 Subject: [PATCH 203/207] Translated using Weblate (Slovak) Currently translated at 1.9% (9 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sk/ --- public/locales/sk/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/sk/common.json b/public/locales/sk/common.json index 193296ac..5f95889c 100644 --- a/public/locales/sk/common.json +++ b/public/locales/sk/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 3ecc6fbae91098c5ee9eb1c480716e2dbe056c6a Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:22 +0000 Subject: [PATCH 204/207] Translated using Weblate (Korean) Currently translated at 36.8% (173 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ko/ --- public/locales/ko/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/ko/common.json b/public/locales/ko/common.json index 02e55749..f9037f52 100644 --- a/public/locales/ko/common.json +++ b/public/locales/ko/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From ec7d2cf309a43568de2a55e8d494e84f82857294 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:12 +0000 Subject: [PATCH 205/207] Translated using Weblate (Greek) Currently translated at 30.4% (143 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/el/ --- public/locales/el/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/el/common.json b/public/locales/el/common.json index 83ec0eee..b36b43f6 100644 --- a/public/locales/el/common.json +++ b/public/locales/el/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 15c8c5552c8558a1451c62cf4e499584dfeeba91 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:16 +0000 Subject: [PATCH 206/207] Translated using Weblate (Slovenian) Currently translated at 95.7% (449 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sl/ --- public/locales/sl/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/sl/common.json b/public/locales/sl/common.json index 174ca1e4..24d4b8f7 100644 --- a/public/locales/sl/common.json +++ b/public/locales/sl/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } } From 009aae7a389f40d6328ec257347c36e3241d9852 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 16 Jun 2023 06:41:12 +0000 Subject: [PATCH 207/207] Translated using Weblate (Indonesian) Currently translated at 3.1% (15 of 469 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/id/ --- public/locales/id/common.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/locales/id/common.json b/public/locales/id/common.json index 7f02801e..0be279a5 100644 --- a/public/locales/id/common.json +++ b/public/locales/id/common.json @@ -647,6 +647,8 @@ }, "jdownloader": { "downloadCount": "Queue Count", - "downloadSpeed": "Download Speed" + "downloadSpeed": "Download Speed", + "downloadBytesRemaining": "Remaining", + "downloadTotalBytes": "Size" } }