From e10e2a36b06ae32cf4829c1c013e1b8bd775b0e0 Mon Sep 17 00:00:00 2001 From: soundsng Date: Thu, 25 Jun 2026 14:49:25 +0100 Subject: [PATCH 1/2] feat: add Stocktake management page [FE-20] (#957) --- frontend/app/(dashboard)/stocktake/page.tsx | 57 +++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 frontend/app/(dashboard)/stocktake/page.tsx diff --git a/frontend/app/(dashboard)/stocktake/page.tsx b/frontend/app/(dashboard)/stocktake/page.tsx new file mode 100644 index 00000000..2bfce3bd --- /dev/null +++ b/frontend/app/(dashboard)/stocktake/page.tsx @@ -0,0 +1,57 @@ +'use client'; + +import { useState } from 'react'; +import { Plus, BarChart3, CheckCircle, AlertTriangle } from 'lucide-react'; +import { Button } from '@/components/ui/button'; + +type AuditStatus = 'SCHEDULED' | 'IN_PROGRESS' | 'COMPLETE'; +interface Audit { id: string; name: string; department: string; scheduledDate: string; status: AuditStatus; total: number; scanned: number; discrepancies: number } + +const MOCK: Audit[] = [ + { id:'1', name:'Q1 IT Audit', department:'Engineering', scheduledDate:'2024-01-30', status:'IN_PROGRESS', total:45, scanned:32, discrepancies:3 }, + { id:'2', name:'Annual Furniture Check', department:'All', scheduledDate:'2024-02-15', status:'SCHEDULED', total:120, scanned:0, discrepancies:0 }, + { id:'3', name:'Q4 2023 Audit', department:'Admin', scheduledDate:'2023-12-20', status:'COMPLETE', total:30, scanned:30, discrepancies:1 }, +]; + +const STATUS_BADGE: Record = { SCHEDULED:'bg-gray-100 text-gray-600', IN_PROGRESS:'bg-blue-50 text-blue-700', COMPLETE:'bg-green-50 text-green-700' }; + +export default function StocktakePage() { + const [audits] = useState(MOCK); + return ( +
+
+

Stocktake

Schedule audits, scan assets, review discrepancies

+ +
+
+ + {["Audit Name","Department","Date","Status","Progress","Discrepancies"].map(h=>)} + + {audits.map(a => { + const pct = a.total > 0 ? Math.round((a.scanned / a.total) * 100) : 0; + return ( + + + + + + + + + ); + })} + +
{h}
{a.name}{a.department}{a.scheduledDate}{a.status.replace('_',' ')} +
+
+ {a.scanned}/{a.total} +
+
+ {a.discrepancies > 0 + ? {a.discrepancies} + : None} +
+
+
+ ); +} \ No newline at end of file From 671b69bcb7d00acd3a516fbd0f41b869eaeb2e24 Mon Sep 17 00:00:00 2001 From: soundsng Date: Thu, 25 Jun 2026 14:49:27 +0100 Subject: [PATCH 2/2] feat: add Organisation settings page [FE-25] (#962) --- .../settings/organisation/page.tsx | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 frontend/app/(dashboard)/settings/organisation/page.tsx diff --git a/frontend/app/(dashboard)/settings/organisation/page.tsx b/frontend/app/(dashboard)/settings/organisation/page.tsx new file mode 100644 index 00000000..f26c8f1e --- /dev/null +++ b/frontend/app/(dashboard)/settings/organisation/page.tsx @@ -0,0 +1,45 @@ +'use client'; + +import { useState } from 'react'; +import { Building2, Upload } from 'lucide-react'; +import { Button } from '@/components/ui/button'; + +export default function OrganisationSettingsPage() { + const [orgName, setOrgName] = useState('Acme Corporation'); + const [tagline, setTagline] = useState('Asset Management Platform'); + const [plan] = useState('Business'); + + return ( +
+

Organisation Settings

Manage org name, branding, and plan information

+
+
+

Organisation Details

+
+
+ setOrgName(e.target.value)} className="w-full text-sm border border-gray-300 rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-gray-900"/>
+
+ setTagline(e.target.value)} className="w-full text-sm border border-gray-300 rounded-lg px-3 py-2 focus:outline-none focus:ring-2 focus:ring-gray-900"/>
+
+ +
+
+

Branding

+
+
+

Organisation Logo

PNG or SVG, max 2MB

+
+
+
+
+

Plan Information

+
+

Current Plan

{plan}

+ Active +
+ +
+
+
+ ); +} \ No newline at end of file