diff --git a/docs/widgets/services/mailcow.md b/docs/widgets/services/mailcow.md new file mode 100644 index 000000000..3cb2ac18f --- /dev/null +++ b/docs/widgets/services/mailcow.md @@ -0,0 +1,15 @@ +--- +title: Mailcow +description: Mailcow Widget Configuration +--- + +Learn more about [Mailcow](https://github.com/mailcow/mailcow-dockerized). + +Allowed fields: `["domains", "mailboxes", "mails", "storage"]`. + +```yaml +widget: + type: mailcow + url: https://mailcow.host.or.ip + key: mailcowapikey +``` diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 3315a0943..561812b31 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -850,6 +850,12 @@ "screenshots": "Screenshots", "totalfilesize": "Total Size" }, + "mailcow": { + "domains": "Domains", + "mailboxes": "Mailboxes", + "mails": "Mails", + "storage": "Storage" + }, "netdata": { "warnings": "Warnings", "criticals": "Criticals" diff --git a/src/widgets/components.js b/src/widgets/components.js index 9f0218938..abeb94226 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")), + mailcow: dynamic(() => import("./mailcow/component")), mastodon: dynamic(() => import("./mastodon/component")), mealie: dynamic(() => import("./mealie/component")), medusa: dynamic(() => import("./medusa/component")), diff --git a/src/widgets/mailcow/component.jsx b/src/widgets/mailcow/component.jsx new file mode 100644 index 000000000..3587eabfb --- /dev/null +++ b/src/widgets/mailcow/component.jsx @@ -0,0 +1,40 @@ +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: resultData, error: resultError } = useWidgetAPI(widget, "domains"); + + if (resultError || (resultData && Object.keys(resultData).length === 0)) { + return ; + } + + if (!resultData) { + return ( + + + + + + ); + } + + const domains = resultData.length; + const mailboxes = resultData.reduce((acc, val) => acc + val.mboxes_in_domain, 0); + const mails = resultData.reduce((acc, val) => acc + val.msgs_total, 0); + const storage = resultData.reduce((acc, val) => acc + val.bytes_total, 0); + + return ( + + + + + + + ); +} diff --git a/src/widgets/mailcow/widget.js b/src/widgets/mailcow/widget.js new file mode 100644 index 000000000..df309ebbd --- /dev/null +++ b/src/widgets/mailcow/widget.js @@ -0,0 +1,14 @@ +import credentialedProxyHandler from "../../utils/proxy/handlers/credentialed"; + +const widget = { + api: "{url}/api/v1/get/{endpoint}", + proxyHandler: credentialedProxyHandler, + + mappings: { + domains: { + endpoint: "domain/all", + }, + }, +}; + +export default widget; diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js index 909fea844..ea48b7fbb 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 mailcow from "./mailcow/widget"; import mastodon from "./mastodon/widget"; import mealie from "./mealie/widget"; import medusa from "./medusa/widget"; @@ -173,6 +174,7 @@ const widgets = { kopia, lidarr, linkwarden, + mailcow, mastodon, mealie, medusa,