Loading package-lock.json +42 −3 Original line number Diff line number Diff line Loading @@ -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", Loading Loading @@ -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", Loading Loading @@ -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", Loading Loading @@ -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", Loading @@ -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", Loading Loading @@ -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", Loading Loading @@ -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", packages/admin/package.json +2 −1 Original line number Diff line number Diff line Loading @@ -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", Loading packages/admin/src/components/sidebar/Sidebar.tsx +7 −0 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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} />} Loading packages/admin/src/main.tsx +17 −4 Original line number Diff line number Diff line Loading @@ -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( [ Loading @@ -32,6 +34,10 @@ const router = createBrowserRouter( path: "/audit", element: <AuditLog />, }, { path: "/reports", element: <ReportsPage />, }, ], }, ], Loading @@ -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> ); packages/admin/src/pages/Reports/ReportTag.tsx 0 → 100644 +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
package-lock.json +42 −3 Original line number Diff line number Diff line Loading @@ -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", Loading Loading @@ -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", Loading Loading @@ -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", Loading Loading @@ -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", Loading @@ -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", Loading Loading @@ -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", Loading Loading @@ -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",
packages/admin/package.json +2 −1 Original line number Diff line number Diff line Loading @@ -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", Loading
packages/admin/src/components/sidebar/Sidebar.tsx +7 −0 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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} />} Loading
packages/admin/src/main.tsx +17 −4 Original line number Diff line number Diff line Loading @@ -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( [ Loading @@ -32,6 +34,10 @@ const router = createBrowserRouter( path: "/audit", element: <AuditLog />, }, { path: "/reports", element: <ReportsPage />, }, ], }, ], Loading @@ -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> );
packages/admin/src/pages/Reports/ReportTag.tsx 0 → 100644 +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> ); } };