diff --git a/package-lock.json b/package-lock.json index 05f5f09..046c494 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,6 @@ "winax": "^3.6.2" }, "devDependencies": { - "@ant-design/v5-patch-for-react-19": "^1.0.3", "@electron-toolkit/eslint-config-prettier": "^3.0.0", "@electron-toolkit/eslint-config-ts": "^3.1.0", "@electron-toolkit/tsconfig": "^2.0.0", @@ -174,21 +173,6 @@ "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@ant-design/v5-patch-for-react-19": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@ant-design/v5-patch-for-react-19/-/v5-patch-for-react-19-1.0.3.tgz", - "integrity": "sha512-iWfZuSUl5kuhqLUw7jJXUQFMMkM7XpW7apmKzQBQHU0cpifYW4A79xIBt9YVO5IBajKpPG5UKP87Ft7Yrw1p/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.x" - }, - "peerDependencies": { - "antd": ">=5.22.6", - "react": ">=19.0.0", - "react-dom": ">=19.0.0" - } - }, "node_modules/@apm-js-collab/code-transformer": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/@apm-js-collab/code-transformer/-/code-transformer-0.8.2.tgz", diff --git a/package.json b/package.json index adc3dca..6b4a436 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "winax": "^3.6.2" }, "devDependencies": { - "@ant-design/v5-patch-for-react-19": "^1.0.3", "@electron-toolkit/eslint-config-prettier": "^3.0.0", "@electron-toolkit/eslint-config-ts": "^3.1.0", "@electron-toolkit/tsconfig": "^2.0.0", diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 1e4fa2a..d1009fd 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -1,10 +1,10 @@ -import "@ant-design/v5-patch-for-react-19"; -import { ConfigProvider, Layout, Space } from "antd"; +import { ConfigProvider, Layout } from "antd"; import { FC } from "react"; import { ErrorBoundary } from "react-error-boundary"; import { Provider } from "react-redux"; import { HashRouter, Route, Routes } from "react-router"; import ErrorBoundaryFallback from "./components/ErrorBoundaryFallback/ErrorBoundaryFallback"; +import Home from "./components/Home/Home"; import Settings from "./components/Settings/Settings"; import UpdateAvailable from "./components/UpdateAvailable/UpdateAvailable"; import reduxStore from "./redux/redux-store"; @@ -32,7 +32,8 @@ const App: FC = () => { - } /> + } /> + } /> diff --git a/src/renderer/src/components/Home/Home.tsx b/src/renderer/src/components/Home/Home.tsx new file mode 100644 index 0000000..6dda336 --- /dev/null +++ b/src/renderer/src/components/Home/Home.tsx @@ -0,0 +1,284 @@ +// renderer/Home.tsx +import { + Button, + Card, + Col, + Flex, + Row, + Space, + Statistic, + Table, + Tag, + Typography, + theme, + List, + Avatar, + Divider, +} from "antd"; +import { FC } from "react"; +import { useNavigate } from "react-router"; +import { + FileTextOutlined, + CheckCircleOutlined, + ClockCircleOutlined, + SettingOutlined, + EyeOutlined, + RightOutlined, +} from "@ant-design/icons"; + +const { Title, Text, Paragraph } = Typography; + +// Placeholder data for recently scrubbed estimates +const placeholderEstimates = [ + { + id: "EST-2026-001", + fileName: "estimate_john_doe.pdf", + scrubbedAt: "2026-01-12T10:30:00", + status: "completed", + itemsProcessed: 24, + }, + { + id: "EST-2026-002", + fileName: "estimate_jane_smith.pdf", + scrubbedAt: "2026-01-12T09:15:00", + status: "completed", + itemsProcessed: 18, + }, + { + id: "EST-2026-003", + fileName: "estimate_acme_corp.pdf", + scrubbedAt: "2026-01-11T16:45:00", + status: "completed", + itemsProcessed: 32, + }, + { + id: "EST-2026-004", + fileName: "estimate_bob_johnson.pdf", + scrubbedAt: "2026-01-11T14:20:00", + status: "completed", + itemsProcessed: 15, + }, + { + id: "EST-2026-005", + fileName: "estimate_tech_solutions.pdf", + scrubbedAt: "2026-01-11T11:00:00", + status: "completed", + itemsProcessed: 27, + }, +]; + +const columns = [ + { + title: "Estimate", + dataIndex: "id", + key: "id", + responsive: ["md"] as const, + render: (text: string, record: (typeof placeholderEstimates)[0]) => ( + + {text} + + {record.fileName} + + + ), + }, + { + title: "File", + dataIndex: "fileName", + key: "fileName", + responsive: ["xs"] as const, + render: (text: string, record: (typeof placeholderEstimates)[0]) => ( + + {record.id} + + {text} + + + ), + }, + { + title: "Scrubbed", + dataIndex: "scrubbedAt", + key: "scrubbedAt", + responsive: ["sm"] as const, + render: (text: string) => { + const date = new Date(text); + return ( + + {date.toLocaleDateString()} + + {date.toLocaleTimeString()} + + + ); + }, + }, + { + title: "Items", + dataIndex: "itemsProcessed", + key: "itemsProcessed", + responsive: ["lg"] as const, + render: (value: number) => {value}, + }, + { + title: "Status", + dataIndex: "status", + key: "status", + responsive: ["sm"] as const, + render: (status: string) => ( + } + style={{ margin: 0 }} + > + {status === "completed" ? "Done" : "Processing"} + + ), + }, + { + title: "", + key: "action", + width: 100, + render: () => ( + + ), + }, +]; + +const Home: FC = () => { + const navigate = useNavigate(); + const { token } = theme.useToken(); + + return ( +
+ + {/* Header */} + + + Dashboard + + + + + {/* Stats Cards */} + + + + + Total Estimates + + } + value={placeholderEstimates.length} + prefix={} + valueStyle={{ color: "#fff", fontWeight: 600 }} + /> + + + + + + Items Scrubbed + + } + value={placeholderEstimates.reduce( + (acc, est) => acc + est.itemsProcessed, + 0, + )} + prefix={} + valueStyle={{ color: "#fff", fontWeight: 600 }} + /> + + + + + + Last Processed + + } + value={new Date( + placeholderEstimates[0].scrubbedAt, + ).toLocaleTimeString()} + prefix={} + valueStyle={{ color: "#fff", fontWeight: 600 }} + /> + + + + + {/* Recent Estimates Card */} + + + Recently Scrubbed Estimates + + } + extra={ + + } + styles={{ + header: { + borderBottom: `2px solid ${token.colorBorderSecondary}`, + }, + }} + > + {/* Table view for larger screens */} +
+ + + + + + ); +}; + +export default Home; diff --git a/src/renderer/src/components/Settings/Settings.Watcher.tsx b/src/renderer/src/components/Settings/Settings.Watcher.tsx index 1de71b2..7777441 100644 --- a/src/renderer/src/components/Settings/Settings.Watcher.tsx +++ b/src/renderer/src/components/Settings/Settings.Watcher.tsx @@ -1,26 +1,18 @@ -import { useAppSelector } from "@renderer/redux/reduxHooks"; -import { - CheckCircleFilled, - ExclamationCircleFilled, - PauseCircleOutlined, - PlayCircleOutlined, -} from "@ant-design/icons"; +import { PauseCircleOutlined, PlayCircleOutlined } from "@ant-design/icons"; import { selectWatcherError, selectWatcherStatus, } from "@renderer/redux/app.slice"; +import { useAppSelector } from "@renderer/redux/reduxHooks"; import { Alert, - Badge, Button, Card, - Divider, Flex, InputNumber, Radio, RadioChangeEvent, Space, - Switch, Typography, } from "antd"; import { FC, useEffect, useState } from "react"; diff --git a/src/renderer/src/components/Settings/Settings.tsx b/src/renderer/src/components/Settings/Settings.tsx index 4fa5a7a..5938a2d 100644 --- a/src/renderer/src/components/Settings/Settings.tsx +++ b/src/renderer/src/components/Settings/Settings.tsx @@ -1,12 +1,25 @@ // renderer/Settings.tsx -import { Space } from "antd"; +import { Button, Space } from "antd"; +import { ArrowLeftOutlined } from "@ant-design/icons"; import { FC } from "react"; +import { useNavigate } from "react-router"; import SettingsConfig from "./Settings.Config"; import SettingsWatcher from "./Settings.Watcher"; const Settings: FC = () => { + const navigate = useNavigate(); + return ( + +