From 283511bf3a5c55bf3c7e9152fc84c3ba312f935d Mon Sep 17 00:00:00 2001 From: Krao Hasanee Date: Thu, 28 May 2026 15:32:46 -0400 Subject: [PATCH] Session 2026-05-28: profile page overhaul, nav fixes, dashboard activity links MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix nav links not working from profile page (useEffect infinite re-render via unstable profile object ref) - Fix nav hover/active: gold icon highlight, no background change; active links non-clickable - Fix hover layout shift: add border: 1px solid transparent to all interactive elements - Header icon buttons (search, theme toggle) now highlight gold on hover - Profile page: replace calendar with activity feed (60/40 grid), add stat cards (tasks completed, active projects, revision requests, submissions) - Profile card: title field, icon rows for location/email/linkedin, member since + role bottom-right, edit button top-right - Profile portrait: remove wrapper column, fix left-gap alignment - Add profiles.title migration - Dashboard recent activity: name → /profile/{id}, task → /requests/{id} (clickable links) - Icon-only sidebar with gold active/hover state, pointer-events: none on active links - layout.md updated with profile page geometry rules Co-Authored-By: Claude Sonnet 4.6 --- layout.md | 171 ++++ package-lock.json | 380 +++++++- package.json | 3 +- public/logonowordmark.png | Bin 0 -> 101681 bytes src/App.jsx | 36 +- src/components/FileAttachment.jsx | 10 +- src/components/FileBrowser.jsx | 8 +- src/components/FilterDropdown.jsx | 36 + src/components/Layout.jsx | 281 ++++-- src/components/ProtectedRoute.jsx | 9 +- src/components/RequestForm.jsx | 2 +- src/index.css | 551 +++++++----- src/lib/activityLog.js | 14 + src/lib/dashboardBanner.jsx | 29 + src/lib/dates.js | 10 + src/lib/withTimeout.js | 2 +- src/pages/BrandBook.jsx | 54 +- src/pages/CompaniesPage.jsx | 44 +- src/pages/CompanyDetail.jsx | 24 +- src/pages/Converters.jsx | 8 +- src/pages/DashboardPage.jsx | 835 ++++++++---------- src/pages/PayInvoice.jsx | 30 +- src/pages/ProjectDetailPage.jsx | 49 +- src/pages/Projects.jsx | 493 +++++++---- src/pages/RequestDetail.jsx | 229 +++-- src/pages/RequestsPage.jsx | 601 ++++++++----- src/pages/Settings.jsx | 491 ++++++++-- src/pages/SurveyMaker.jsx | 8 +- src/pages/client/MyInvoices.jsx | 48 +- src/pages/client/NewProject.jsx | 2 +- src/pages/client/NewRequest.jsx | 11 +- src/pages/external/MyInvoiceCreate.jsx | 45 +- src/pages/external/MyInvoiceDetail.jsx | 37 +- src/pages/external/MyInvoices.jsx | 47 +- src/pages/external/MyPurchaseOrders.jsx | 20 +- src/pages/team/CreateInvoice.jsx | 21 +- src/pages/team/CreateSubcontractorPO.jsx | 12 +- src/pages/team/FourgePasswords.jsx | 4 +- src/pages/team/InvoiceDetail.jsx | 39 +- src/pages/team/Invoices.jsx | 283 +++--- src/pages/team/MeetingNotes.jsx | 194 ---- src/pages/team/SubInvoiceDetail.jsx | 36 +- src/pages/team/SubcontractorPODetail.jsx | 30 +- src/pages/team/TeamDashboard.jsx | 712 +++++++++++++++ supabase/functions/send-email/index.ts | 41 +- .../20260520000000_add_activity_log.sql | 21 + ...001_auto_project_member_on_task_assign.sql | 27 + .../20260528000000_add_title_to_profiles.sql | 2 + 48 files changed, 4151 insertions(+), 1889 deletions(-) create mode 100644 layout.md create mode 100644 public/logonowordmark.png create mode 100644 src/components/FilterDropdown.jsx create mode 100644 src/lib/activityLog.js create mode 100644 src/lib/dashboardBanner.jsx delete mode 100644 src/pages/team/MeetingNotes.jsx create mode 100644 src/pages/team/TeamDashboard.jsx create mode 100644 supabase/migrations/20260520000000_add_activity_log.sql create mode 100644 supabase/migrations/20260520000001_auto_project_member_on_task_assign.sql create mode 100644 supabase/migrations/20260528000000_add_title_to_profiles.sql diff --git a/layout.md b/layout.md new file mode 100644 index 0000000..ace7094 --- /dev/null +++ b/layout.md @@ -0,0 +1,171 @@ +# Fourge Portal Layout System + +This is the single source of truth for dashboard/profile visual structure and UI geometry. + +## 1) Global Frame +- Viewport app shell: `height: 100vh`, `overflow: hidden` +- Main content gutter: `24px` all sides +- Sidebar: `width: 76px`, `top: 24px`, `left: 24px`, `height: calc(100vh - 48px)`, `border-radius: 8px` +- Main wrapper offset from sidebar: `margin-left: 100px` +- Page rhythm unit: `24px` (header spacing, card gaps, section gaps) + +## 2) Theme + Background +- Background ownership is `body` via `background: var(--bg)`. +- Dark base token `--bg` is full gradient: + - radial glow + vertical dark gradient. +- Light base token `--bg` is full gradient: + - gray radial glow + white vertical gradient. +- Do not use `html` theme-gradient scripting for Safari chrome behavior. + +## 3) Tokens +- Accent: `#F5A523` +- Card bg dark: `rgba(255,255,255,0.02)` +- Card bg light: `rgba(0,0,0,0.02)` +- Secondary card tone dark: `rgba(255,255,255,0.08)` +- Secondary card tone light: `rgba(0,0,0,0.08)` +- Border dark: `rgba(245,165,35,0.15)` +- Border light: `rgba(0,0,0,0.1)` +- Text primary dark/light: `#ffffff / #0d0d0d` +- Text secondary dark/light: `#a8a8a8 / rgba(0,0,0,0.6)` +- Text muted dark/light: `#666666 / rgba(0,0,0,0.38)` + +## 4) Typography +- Font family: `Fourge`, then `-apple-system`, `BlinkMacSystemFont`, `'Segoe UI'`, `sans-serif` +- Base font size: `14px` +- Header title: `28px`, `500`, `line-height: 1.2` +- Header subtitle: `13px` +- Widget title: `11px`, `500`, uppercase, `letter-spacing: 0.8px` +- Body table text: `12px/13px` by column importance + +## 5) Card System +- Default widget shell: + - `background: var(--card-bg)` + - `border: 1px solid var(--border)` + - `border-radius: 8px` + - `padding: 18px 21px` + - `backdrop-filter: blur(12px)` + `-webkit-backdrop-filter` +- Compact card radius (legacy generic `.card`): `4px` (do not use for new dashboard widgets) + +## 6) Header + Top Right Controls +- Site header: `padding-top: 24px`, `padding-bottom: 24px` +- Right control row: + - Search icon button: `32x32` + - Search button to theme toggle space: `7px` (`search-wrap margin-right`) + - Theme toggle: `32x32` + - Theme toggle to avatar: `14px` (`avatar-wrap margin-left`) + - Avatar button: `49x49`, circle, `2px` inner ring + `2px` accent outline + +## 7) Dashboard Grids (Team) +- Stat row: `grid-template-columns: 1fr 1fr 1fr 1.5fr`, `gap: 24`, `margin-bottom: 0` +- Row 2: `grid-template-columns: 1fr 280px`, `gap: 24`, `margin-top: 24` +- Row 3: `grid-template-columns: 1fr 1fr`, `gap: 24`, `margin-top: 24` +- Row 4 full-width: `margin-top: 24` + +## 8) Stat Cards +- Card min height: `120px` +- Internal row gap: `21px` +- Label/value/sub spacing: + - Label: `margin-bottom: 5px` + - Value: `30px`, `400`, `letter-spacing: -0.5`, `line-height: 1.1` + - Sub: `12px`, `margin-top: 5px` +- Icon badge: `27x27`, circle +- Icon glyph: `13x13` + +## 9) Calendar +- Card uses widget shell +- Header-to-grid gap: `14px` +- Weekday label: `10px`, `600`, `letter-spacing: 0.5` +- Day cell button: `28x28`, circular +- Day number: `12px` +- Today style: bg `#F5A523`, text `#0d0d0d`, `700` +- Dots: up to 3, each `3x3`, gap `2` +- Popover: + - Anchored left of cell: `right: calc(100% + 8px)`, vertical centered + - `width: 210px`, `padding: 10px 12px`, `border-radius: 8px` + - shadow `0 12px 32px rgba(0,0,0,0.45)` + - row dot `6x6`, row text `12px` + +## 10) Activity + Performance Rows +- Visible rows target: 5 +- Row layout: `display:flex`, `align-items:center`, `gap:10px` +- Row spacing: `margin-top: 10px` from second row onward +- Name text: `13px` +- Meta/date text: `11px` +- Progress track: `height: 4px`, `radius: 2px` +- Percentage width slot: `min-width: 28px` + +## 11) Tables +- General table layout in dashboard cards: `table-layout: fixed`, `border-collapse: collapse` +- Header cells: + - `font-size: 10px`, `font-weight: 500`, uppercase, `letter-spacing: 0.6px` + - bottom spacing: `padding-bottom: 12px` +- Body cells: + - primary text: `13px` + - secondary/metrics text: `12px` + - row vertical spacing via cell padding: typically `5px` +- Hot Items column widths: + - check `10%`, task `40%`, requested by `35%`, due by `15%` +- Client Highlight column widths: + - icon `5%`, company `22%`, contact `23%`, projects `13%`, open `13%`, outstanding `12%`, paid `12%` +- Sorting rule: + - Every visible data column header must be sortable. + - Use clickable header controls (`SortTh`) with ascending/descending indicator. + - Exclude only non-data utility/action columns (checkbox-only, icon-only status marker, action buttons). + +## 12) Profile Page +- Container: full available content width, column, `gap: 24` +- Top row: `grid-template-columns: 1fr 280px`, `gap: 24` +- At `<=1200px`: top row stacks to one column +- Main profile card uses widget shell +- Internal card layout: + - row `gap: 20px` + - portrait column `width: 160px`, portrait max `140x140`, circle + - detail grid `140px 1fr`, `row-gap: 8`, `column-gap: 12`, `margin-top: 14` + - social row `margin-top: 14`, `gap: 8` + - self-only edit button: `position: absolute`, `top: 18px`, `right: 21px` (aligns to card padding), `border-radius: 8px` (matches card), `height: 30px`, `font-size: 12px` +- Right calendar card shows only tasks/events assigned to the viewed profile user +- Modal: + - overlay: fixed inset, `z-index: 1200`, bg `rgba(0,0,0,0.58)`, blur `6px` + - overlay padding: `24px` + - modal width: `min(620px, 100%)` + - modal max-height: `calc(100vh - 48px)`, `overflow-y: auto` + +## 13) Radius + Geometry Rules +- Dashboard/profile widgets: `8px` radius +- Sidebar: `8px` radius +- Buttons/input/dropdowns mostly `4px` radius +- Circular elements (avatar/day/icon badges): `50%` + +## 14) Z-Index Stack +- Sidebar: `200` +- Header dropdowns/tooltips: `300` +- Calendar hover popover: `1002` within card context (`card can be 1001 active`) +- Modal overlay: `1200` + +## 15) Motion +- Motion vars: + - fast `160ms` + - base `220ms` + - easing `cubic-bezier(0.22, 1, 0.36, 1)` +- Dropdown animation: `ui-fade-up` from `translateY(4px)` + opacity 0 -> 1 + +## 17) Hover Interaction Contract +- Sidebar, header icon buttons, dropdown items, and avatar menu items must show a visible hover surface before click. +- Single hover source-of-truth block controls these elements. +- Dark hover surface baseline: `#1f1f1f`. +- Light hover surface baseline: `rgba(0,0,0,0.08)`. +- Nav icon opacity must lift from muted to full on hover (`opacity: 1`). +- Hover and active must be visually distinct: + - hover uses stronger temporary contrast (`bg` + thin border), + - active remains persistent selected-state background. + +## 16) Non-Negotiable Implementation Rules +- Keep gradient backgrounds on `html`, not `body` +- Keep widget shell values (`18px 21px`, `8px`, blur 12, border token) consistent +- Maintain global `24px` spacing rhythm for page/frame/grid gaps +- Keep team dashboard card order: + 1. Open Tasks + 2. Active Projects + 3. Net Profit + 4. Revenue (wide) +- Keep row 2 order: Recent Activity (left), Calendar (right) diff --git a/package-lock.json b/package-lock.json index cec7c2d..a6a6ec3 100755 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,8 @@ "jszip": "^3.10.1", "react": "^19.2.4", "react-dom": "^19.2.4", - "react-router-dom": "^7.13.1" + "react-router-dom": "^7.13.1", + "recharts": "^2.15.4" }, "devDependencies": { "@eslint/js": "^9.39.4", @@ -962,6 +963,69 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1272,6 +1336,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1366,9 +1439,129 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, "license": "MIT" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1387,6 +1580,12 @@ } } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1404,6 +1603,16 @@ "node": ">=8" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dompurify": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz", @@ -1628,6 +1837,12 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1635,6 +1850,15 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-equals": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1897,6 +2121,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/iobuffer": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz", @@ -1943,7 +2176,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -2360,6 +2592,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2367,6 +2605,18 @@ "dev": true, "license": "MIT" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -2430,6 +2680,15 @@ "dev": true, "license": "MIT" }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -2591,6 +2850,23 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "license": "MIT" }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -2632,6 +2908,12 @@ "react": "^19.2.4" } }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, "node_modules/react-router": { "version": "7.13.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.1.tgz", @@ -2670,6 +2952,37 @@ "react-dom": ">=18" } }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -2685,6 +2998,39 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/recharts": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", + "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==", + "deprecated": "1.x and 2.x branches are no longer active. Bump to Recharts v3 to receive latest features and bugfixes. See https://github.com/recharts/recharts/wiki/3.0-migration-guide", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", @@ -2885,6 +3231,12 @@ "utrie": "^1.0.2" } }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -2984,6 +3336,28 @@ "base64-arraybuffer": "^1.0.2" } }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/vite": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.0.tgz", diff --git a/package.json b/package.json index 6f52232..54648c8 100755 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "jszip": "^3.10.1", "react": "^19.2.4", "react-dom": "^19.2.4", - "react-router-dom": "^7.13.1" + "react-router-dom": "^7.13.1", + "recharts": "^2.15.4" }, "devDependencies": { "@eslint/js": "^9.39.4", diff --git a/public/logonowordmark.png b/public/logonowordmark.png new file mode 100644 index 0000000000000000000000000000000000000000..73662114b647ed4a0fa6d0d18d475e6eaf0ff633 GIT binary patch literal 101681 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%0AMKd}6>P(xF^^)X*|FbWrEqlQ3!0ldGjFO7 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 literal 0 HcmV?d00001 diff --git a/src/App.jsx b/src/App.jsx index 2413bef..224a8d1 100755 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,18 +1,32 @@ import { lazy, Suspense, Component } from 'react'; import { BrowserRouter, Routes, Route, Navigate, useParams } from 'react-router-dom'; -import { AuthProvider } from './context/AuthContext'; +import { AuthProvider, useAuth } from './context/AuthContext'; import ProtectedRoute from './components/ProtectedRoute'; import PageLoader from './components/PageLoader'; class ChunkErrorBoundary extends Component { state = { error: null }; static getDerivedStateFromError(error) { return { error }; } + componentDidCatch(error) { + const isChunkError = error?.name === 'ChunkLoadError' + || error?.message?.includes('dynamically imported module') + || error?.message?.includes('Failed to fetch'); + if (isChunkError) { + const key = 'chunk_reload_attempted'; + if (!sessionStorage.getItem(key)) { + sessionStorage.setItem(key, '1'); + window.location.reload(); + return; + } + sessionStorage.removeItem(key); + } + } render() { if (this.state.error) { return (
Page failed to load.
-
@@ -25,11 +39,10 @@ class ChunkErrorBoundary extends Component { import Login from './pages/Login'; import PayInvoice from './pages/PayInvoice'; -const Settings = lazy(() => import('./pages/Settings')); +const ProfilePage = lazy(() => import('./pages/Settings')); const CompaniesPage = lazy(() => import('./pages/CompaniesPage')); const CompanyDetail = lazy(() => import('./pages/CompanyDetail')); const Invoices = lazy(() => import('./pages/team/Invoices')); -const MeetingNotes = lazy(() => import('./pages/team/MeetingNotes')); const RequestDetail = lazy(() => import('./pages/RequestDetail')); const CreateInvoice = lazy(() => import('./pages/team/CreateInvoice')); const CreateSubcontractorPO = lazy(() => import('./pages/team/CreateSubcontractorPO')); @@ -48,6 +61,7 @@ const ExternalMyInvoiceCreate = lazy(() => import('./pages/external/MyInvoiceCre const Projects = lazy(() => import('./pages/Projects')); const ProjectDetailPage = lazy(() => import('./pages/ProjectDetailPage')); const DashboardPage = lazy(() => import('./pages/DashboardPage')); +const TeamDashboard = lazy(() => import('./pages/team/TeamDashboard')); const RequestsPage = lazy(() => import('./pages/RequestsPage')); const MyInvoices = lazy(() => import('./pages/client/MyInvoices')); const NewRequest = lazy(() => import('./pages/client/NewRequest')); @@ -68,6 +82,12 @@ function NavigateCompanyDetail() { return ; } +function DashboardRoute() { + const { currentUser } = useAuth(); + if (currentUser?.role === 'team') return ; + return ; +} + export default function App() { return ( @@ -77,7 +97,8 @@ export default function App() { } /> - } /> + } /> + } /> } /> } /> } /> @@ -88,7 +109,6 @@ export default function App() { } /> } /> } /> - } /> } /> } /> } /> @@ -109,7 +129,9 @@ export default function App() { } /> } /> - } /> + } /> + } /> + } /> } /> } /> diff --git a/src/components/FileAttachment.jsx b/src/components/FileAttachment.jsx index b724d7f..65910e6 100755 --- a/src/components/FileAttachment.jsx +++ b/src/components/FileAttachment.jsx @@ -1,7 +1,7 @@ import { useState, useRef } from 'react'; const MAX_FILES = 20; -const MAX_SIZE_MB = 50; +const MAX_SIZE_MB = 250; const MAX_SIZE_BYTES = MAX_SIZE_MB * 1024 * 1024; const formatSize = (bytes) => { @@ -74,7 +74,7 @@ export default function FileAttachment({ files, onChange }) { onDrop={handleDrop} style={{ border: `2px dashed ${dragging ? 'var(--accent)' : files.length > 0 ? 'var(--accent)' : 'var(--border)'}`, - borderRadius: 8, padding: '18px 16px', textAlign: 'center', + borderRadius: 4, padding: '18px 16px', textAlign: 'center', background: dragging ? 'color-mix(in srgb, var(--accent) 8%, var(--bg))' : 'var(--bg)', transition: 'all 0.15s', }} @@ -82,7 +82,7 @@ export default function FileAttachment({ files, onChange }) {