Commit 7a3bd0f7 authored by Grant's avatar Grant
Browse files

Merge branch '102-pixel-reporting' into 'main'

Pixel reporting

Closes #102

See merge request !100
parents 2cc1e5f8 543691b2
Loading
Loading
Loading
Loading
+42 −3
Original line number Diff line number Diff line
@@ -11001,6 +11001,14 @@
        "node": ">= 0.8"
      }
    },
    "node_modules/dequal": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
      "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/destroy": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
@@ -18042,6 +18050,18 @@
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/swr": {
      "version": "2.3.3",
      "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz",
      "integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==",
      "dependencies": {
        "dequal": "^2.0.3",
        "use-sync-external-store": "^1.4.0"
      },
      "peerDependencies": {
        "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
      }
    },
    "node_modules/tailwind-merge": {
      "version": "2.6.0",
      "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz",
@@ -19201,6 +19221,14 @@
        }
      }
    },
    "node_modules/use-sync-external-store": {
      "version": "1.5.0",
      "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
      "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
      "peerDependencies": {
        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
      }
    },
    "node_modules/util-deprecate": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -19779,6 +19807,14 @@
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/zod": {
      "version": "3.25.30",
      "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.30.tgz",
      "integrity": "sha512-VolhdEtu6TJr/fzGuHA/SZ5ixvXqA6ADOG9VRcQ3rdOKmF5hkmcJbyaQjUH5BgmpA9gej++zYRX7zjSmdReIwA==",
      "funding": {
        "url": "https://github.com/sponsors/colinhacks"
      }
    },
    "packages/admin": {
      "name": "@sc07-canvas/admin",
      "version": "0.0.0",
@@ -19789,7 +19825,8 @@
        "localforage": "^1.10.0",
        "match-sorter": "^8.0.0",
        "react-apexcharts": "^1.7.0",
        "react-router-dom": "^7.1.1"
        "react-router-dom": "^7.1.1",
        "swr": "^2.3.3"
      },
      "devDependencies": {
        "eslint-plugin-react-refresh": "^0.4.16",
@@ -19838,7 +19875,8 @@
        "lodash.throttle": "^4.1.1",
        "prop-types": "^15.8.1",
        "react-zoom-pan-pinch": "^3.4.1",
        "socket.io-client": "^4.8.1"
        "socket.io-client": "^4.8.1",
        "swr": "^2.3.3"
      },
      "devDependencies": {
        "@types/grecaptcha": "^3.0.9",
@@ -19915,7 +19953,8 @@
        "rate-limit-redis": "^4.2.0",
        "redis": "^4.7.0",
        "socket.io": "^4.8.1",
        "winston": "^3.17.0"
        "winston": "^3.17.0",
        "zod": "^3.25.30"
      },
      "devDependencies": {
        "@tsconfig/recommended": "^1.0.8",
+2 −1
Original line number Diff line number Diff line
@@ -16,7 +16,8 @@
    "localforage": "^1.10.0",
    "match-sorter": "^8.0.0",
    "react-apexcharts": "^1.7.0",
    "react-router-dom": "^7.1.1"
    "react-router-dom": "^7.1.1",
    "swr": "^2.3.3"
  },
  "devDependencies": {
    "eslint-plugin-react-refresh": "^0.4.16",
+7 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ import {
  faShieldHalved,
  faSquare,
  faUsers,
  faWarning,
} from "@fortawesome/free-solid-svg-icons";
import { useLocation } from "react-router-dom";
import { CollapseItems } from "./collapse-items";
@@ -55,6 +56,12 @@ export const SidebarWrapper = () => {
              isActive={pathname === "/"}
              href="/"
            />
            <SidebarItem
              title="Pixel Reports"
              icon={<FontAwesomeIcon icon={faWarning} />}
              isActive={pathname === "/reports"}
              href="/reports"
            />
            <SidebarItem
              title="Audit Log"
              icon={<FontAwesomeIcon icon={faList} />}
+17 −4
Original line number Diff line number Diff line
@@ -9,6 +9,8 @@ import { AccountsPage } from "./pages/Accounts/Accounts/page.tsx";
import { ServiceSettingsPage } from "./pages/Service/settings.tsx";
import { AuditLog } from "./pages/AuditLog/auditlog.tsx";
import { ToastWrapper } from "./components/ToastWrapper.tsx";
import { ReportsPage } from "./pages/Reports/page.tsx";
import { SWRConfig } from "swr";

const router = createBrowserRouter(
  [
@@ -32,6 +34,10 @@ const router = createBrowserRouter(
          path: "/audit",
          element: <AuditLog />,
        },
        {
          path: "/reports",
          element: <ReportsPage />,
        },
      ],
    },
  ],
@@ -43,11 +49,18 @@ const router = createBrowserRouter(
ReactDOM.createRoot(document.getElementById("root")!).render(
  <React.StrictMode>
    <NextUIProvider>
      <SWRConfig
        value={{
          fetcher: (resource, init) =>
            fetch(resource, init).then((res) => res.json()),
        }}
      >
        <main className="dark text-foreground bg-background">
          <RouterProvider router={router} />

          <ToastWrapper />
        </main>
      </SWRConfig>
    </NextUIProvider>
  </React.StrictMode>
);
+24 −0
Original line number Diff line number Diff line
import { Chip } from "@nextui-org/react";

export const ReportTag = ({
  status,
}: {
  status: "NEW" | "RESOLVED" | "REJECTED";
}) => {
  switch (status) {
    case "NEW":
      return <Chip color="warning">NEW</Chip>;
    case "RESOLVED":
      return (
        <Chip color="success" variant="dot">
          Resolved
        </Chip>
      );
    case "REJECTED":
      return (
        <Chip color="danger" variant="dot">
          Rejected
        </Chip>
      );
  }
};
Loading