From a677a507b874a56468e5479b65d8f00e6728265a Mon Sep 17 00:00:00 2001
From: Niklas <niklastasler@gmail.com>
Date: Fri, 25 Nov 2022 16:05:53 +0100
Subject: [PATCH] Added paperless-ngx widget

---
 public/locales/en/common.json          |  4 +++
 src/utils/config/service-helpers.js    |  3 ++
 src/widgets/components.js              |  1 +
 src/widgets/paperlessngx/component.jsx | 42 ++++++++++++++++++++++++++
 src/widgets/paperlessngx/widget.js     | 25 +++++++++++++++
 src/widgets/widgets.js                 |  2 ++
 6 files changed, 77 insertions(+)
 create mode 100644 src/widgets/paperlessngx/component.jsx
 create mode 100644 src/widgets/paperlessngx/widget.js

diff --git a/public/locales/en/common.json b/public/locales/en/common.json
index 0d1368a6..063e33b5 100644
--- a/public/locales/en/common.json
+++ b/public/locales/en/common.json
@@ -349,5 +349,9 @@
         "passed": "Passed",
         "failed": "Failed",
         "unknown": "Unknown"
+    },
+    "paperlessngx": {
+        "inbox": "Inbox",
+        "total": "Total"
     }
 }
diff --git a/src/utils/config/service-helpers.js b/src/utils/config/service-helpers.js
index 15740d22..d8367de3 100644
--- a/src/utils/config/service-helpers.js
+++ b/src/utils/config/service-helpers.js
@@ -118,6 +118,7 @@ export function cleanServiceGroups(groups) {
           container,
           currency, // coinmarketcap widget
           symbols,
+          inboxTag, // paperlessngx widget
         } = cleanedService.widget;
 
         cleanedService.widget = {
@@ -129,6 +130,8 @@ export function cleanServiceGroups(groups) {
 
         if (currency) cleanedService.widget.currency = currency;
         if (symbols) cleanedService.widget.symbols = symbols;
+        
+        if (inboxTag) cleanedService.widget.inboxTag = inboxTag;
 
         if (type === "docker") {
           if (server) cleanedService.widget.server = server;
diff --git a/src/widgets/components.js b/src/widgets/components.js
index d645d80d..eb7c8127 100644
--- a/src/widgets/components.js
+++ b/src/widgets/components.js
@@ -23,6 +23,7 @@ const components = {
   nzbget: dynamic(() => import("./nzbget/component")),
   ombi: dynamic(() => import("./ombi/component")),
   overseerr: dynamic(() => import("./overseerr/component")),
+  paperlessngx: dynamic(() => import("./paperlessngx/component")),
   pihole: dynamic(() => import("./pihole/component")),
   plex: dynamic(() => import("./plex/component")),
   portainer: dynamic(() => import("./portainer/component")),
diff --git a/src/widgets/paperlessngx/component.jsx b/src/widgets/paperlessngx/component.jsx
new file mode 100644
index 00000000..131c0419
--- /dev/null
+++ b/src/widgets/paperlessngx/component.jsx
@@ -0,0 +1,42 @@
+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 { widget } = service;
+
+  const { data: inboxData, error: inboxError } = useWidgetAPI(widget, "inbox",
+  {
+    query: `tag:${widget.inboxTag}`,
+    format: "json",
+    fields: "count"
+  });
+
+
+  const { data: documentData, error: documentError } = useWidgetAPI(widget, "documents",
+  {
+    fields: "count",
+    format: "json",
+  });
+
+  if (inboxError || documentError) {
+    const finalError = inboxError ?? documentError;
+    return <Container error={finalError} />;
+  }
+
+  if (!inboxData || !documentData) {
+    return (
+      <Container service={service}>
+        <Block label="paperlessngx.inbox" />
+        <Block label="paperlessngx.total" />
+      </Container>
+    );
+  }
+
+  return (
+    <Container service={service}>
+      <Block label="paperlessngx.inbox" value={inboxData.count} />
+      <Block label="paperlessngx.total" value={documentData.count} />
+    </Container>
+  );
+}
diff --git a/src/widgets/paperlessngx/widget.js b/src/widgets/paperlessngx/widget.js
new file mode 100644
index 00000000..9671a053
--- /dev/null
+++ b/src/widgets/paperlessngx/widget.js
@@ -0,0 +1,25 @@
+import genericProxyHandler from "utils/proxy/handlers/generic";
+
+const widget = {
+  api: "{url}/api/{endpoint}",
+  proxyHandler: genericProxyHandler,
+
+  mappings: {
+    "inbox": {
+      endpoint: "documents/",
+      params: ["format", "query", "fields"],
+      validate: [
+        "count"
+      ]
+    },
+    "documents": {
+      endpoint: "documents/",
+      params: ["format", "fields"],
+      validate: [
+        "count"
+      ]
+    },
+  },
+};
+
+export default widget;
diff --git a/src/widgets/widgets.js b/src/widgets/widgets.js
index 3f1c6e08..2d2f453d 100644
--- a/src/widgets/widgets.js
+++ b/src/widgets/widgets.js
@@ -18,6 +18,7 @@ import npm from "./npm/widget";
 import nzbget from "./nzbget/widget";
 import ombi from "./ombi/widget";
 import overseerr from "./overseerr/widget";
+import paperlessngx from "./paperlessngx/widget";
 import pihole from "./pihole/widget";
 import plex from "./plex/widget";
 import portainer from "./portainer/widget";
@@ -63,6 +64,7 @@ const widgets = {
   nzbget,
   ombi,
   overseerr,
+  paperlessngx,
   pihole,
   plex,
   portainer,