From 8c12afced548a7c20b52372c9bd2e28ab0e762be Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 23 Sep 2024 23:25:12 -0700 Subject: [PATCH] Feature: LubeLogger service widget (#4031) --- docs/widgets/services/index.md | 1 + docs/widgets/services/lubelogger.md | 20 +++++++++ public/locales/en/common.json | 8 ++++ src/utils/config/service-helpers.js | 6 +++ src/widgets/components.js | 1 + src/widgets/lubelogger/component.jsx | 65 ++++++++++++++++++++++++++++ src/widgets/lubelogger/widget.js | 14 ++++++ src/widgets/widgets.js | 2 + 8 files changed, 117 insertions(+) create mode 100644 docs/widgets/services/lubelogger.md create mode 100644 src/widgets/lubelogger/component.jsx create mode 100644 src/widgets/lubelogger/widget.js diff --git a/docs/widgets/services/index.md b/docs/widgets/services/index.md index f633dfd2..6af2aeed 100644 --- a/docs/widgets/services/index.md +++ b/docs/widgets/services/index.md @@ -59,6 +59,7 @@ You can also find a list of all available service widgets in the sidebar navigat - [Kopia](kopia.md) - [Lidarr](lidarr.md) - [Linkwarden](linkwarden.md) +- [Lubelogger](lubelogger.md) - [Mastodon](mastodon.md) - [Mealie](mealie.md) - [Medusa](medusa.md) diff --git a/docs/widgets/services/lubelogger.md b/docs/widgets/services/lubelogger.md new file mode 100644 index 00000000..baa0e4d5 --- /dev/null +++ b/docs/widgets/services/lubelogger.md @@ -0,0 +1,20 @@ +--- +title: LubeLogger +description: LubeLogger Widget Configuration +--- + +Learn more about [LubeLogger](https://github.com/hargata/lubelog) (v1.3.7 or higher is required). + +The widget comes in two 'flavors', one shows data for all vehicles or for just a specific vehicle with the `vehicleID` parameter. + +Allowed fields: `["vehicles", "serviceRecords", "reminders"]`. +For the single-vehicle version: `["vehicle", "serviceRecords", "reminders", "nextReminder"] + +```yaml +widget: + type: lubelogger + url: https://lubelogger.host.or.ip + username: lubeloggerusername + password: lubeloggerpassword + vehicleID: 1 # optional, changes to single-vehicle version +``` diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 561812b3..3aea07eb 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -945,5 +945,13 @@ "average": "Average", "high": "High", "disaster": "Disaster" + }, + "lubelogger": { + "vehicle": "Vehicle", + "vehicles": "Vehicles", + "serviceRecords": "Service Records", + "reminders": "Reminders", + "nextReminder": "Next Reminder", + "none": "None" } } diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js index 0dfbc944..dfae80ff 100644 --- a/src/utils/config/service-helpers.js +++ b/src/utils/config/service-helpers.js @@ -442,6 +442,9 @@ export function cleanServiceGroups(groups) { namespace, podSelector, + // lubelogger + vehicleID, + // mjpeg fit, stream, @@ -627,6 +630,9 @@ export function cleanServiceGroups(groups) { if (type === "technitium") { if (range !== undefined) cleanedService.widget.range = range; } + if (type === "lubelogger") { + if (vehicleID !== undefined) cleanedService.widget.vehicleID = vehicleID; + } } return cleanedService; diff --git a/src/widgets/components.js b/src/widgets/components.js index abeb9422..0a5a815c 100644 --- a/src/widgets/components.js +++ b/src/widgets/components.js @@ -56,6 +56,7 @@ const components = { kopia: dynamic(() => import("./kopia/component")), lidarr: dynamic(() => import("./lidarr/component")), linkwarden: dynamic(() => import("./linkwarden/component")), + lubelogger: dynamic(() => import("./lubelogger/component")), mailcow: dynamic(() => import("./mailcow/component")), mastodon: dynamic(() => import("./mastodon/component")), mealie: dynamic(() => import("./mealie/component")), diff --git a/src/widgets/lubelogger/component.jsx b/src/widgets/lubelogger/component.jsx new file mode 100644 index 00000000..48995073 --- /dev/null +++ b/src/widgets/lubelogger/component.jsx @@ -0,0 +1,65 @@ +import { useTranslation } from "react-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; + let { data: vehicleInfo, error } = useWidgetAPI(widget, "vehicleinfo"); + + if (error) { + return ; + } + + if (!vehicleInfo) { + return ( + + + + + + ); + } + + const { vehicleID } = widget; + if (vehicleID) { + vehicleInfo = vehicleInfo.filter((v) => v.vehicleData.id === vehicleID); + } + const totalReminders = vehicleInfo.reduce( + (acc, val) => acc + val.veryUrgentReminderCount + val.urgentReminderCount + val.notUrgentReminderCount, + 0, + ); + const totalServiceRecords = vehicleInfo.reduce((acc, val) => acc + val.serviceRecordCount, 0); + + if (vehicleID) { + if (vehicleInfo.length === 0) { + error = { message: "Vehicle not found" }; + return ; + } + + const nextReminder = vehicleInfo[0].nextReminder + ? t("common.date", { value: vehicleInfo[0].nextReminder.dueDate }) + : t("lubelogger.none"); + return ( + + + + + + + ); + } + + return ( + + + + + + ); +} diff --git a/src/widgets/lubelogger/widget.js b/src/widgets/lubelogger/widget.js new file mode 100644 index 00000000..87e34ce6 --- /dev/null +++ b/src/widgets/lubelogger/widget.js @@ -0,0 +1,14 @@ +import genericProxyHandler from "utils/proxy/handlers/generic"; + +const widget = { + api: "{url}/api/{endpoint}", + proxyHandler: genericProxyHandler, + + mappings: { + vehicleinfo: { + endpoint: "vehicle/info", + }, + }, +}; + +export default widget; diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js index ea48b7fb..3334e47e 100644 --- a/src/widgets/widgets.js +++ b/src/widgets/widgets.js @@ -48,6 +48,7 @@ import komga from "./komga/widget"; import kopia from "./kopia/widget"; import lidarr from "./lidarr/widget"; import linkwarden from "./linkwarden/widget"; +import lubelogger from "./lubelogger/widget"; import mailcow from "./mailcow/widget"; import mastodon from "./mastodon/widget"; import mealie from "./mealie/widget"; @@ -174,6 +175,7 @@ const widgets = { kopia, lidarr, linkwarden, + lubelogger, mailcow, mastodon, mealie,