diff --git a/app/dashboard/finance/budget/page.tsx b/app/dashboard/finance/budget/page.tsx new file mode 100644 index 0000000..21b7833 --- /dev/null +++ b/app/dashboard/finance/budget/page.tsx @@ -0,0 +1,18 @@ +"use client" + +import BudgetPortal from "@/components/dashboard/finance/budget"; + + + + +export default function BudgetPage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/finance/costinvoice/page.tsx b/app/dashboard/finance/costinvoice/page.tsx new file mode 100644 index 0000000..41fb177 --- /dev/null +++ b/app/dashboard/finance/costinvoice/page.tsx @@ -0,0 +1,18 @@ +"use client" + +import CostInvoicePortal from "@/components/dashboard/finance/costInvoice"; + + + + +export default function CostInvoicePage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/insight/report/page.tsx b/app/dashboard/insight/report/page.tsx new file mode 100644 index 0000000..65ed667 --- /dev/null +++ b/app/dashboard/insight/report/page.tsx @@ -0,0 +1,19 @@ +"use client" + + +import ReportPortal from "@/components/dashboard/insight/reports"; + + + + +export default function ReportPage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/layout.tsx b/app/dashboard/layout.tsx index 037892c..830652a 100644 --- a/app/dashboard/layout.tsx +++ b/app/dashboard/layout.tsx @@ -1,6 +1,6 @@ "use client"// app/dashboard/layout.tsx -import Sidebar from "@/utils/sidebar"; -import Navbar from "@/utils/navbar"; +import Sidebar from "@/components/layouts/sidebar"; +import Navbar from "@/components/layouts/navbar"; import { Sparkles } from "lucide-react"; export default function DashboardLayout({ diff --git a/app/dashboard/operations/energy/page.tsx b/app/dashboard/operations/energy/page.tsx index 2c21636..9401625 100644 --- a/app/dashboard/operations/energy/page.tsx +++ b/app/dashboard/operations/energy/page.tsx @@ -1,9 +1,9 @@ "use client" -import EnergyPortal from "@/components/dashboard/energy"; +import EnergyPortal from "@/components/dashboard/operations/energy"; -export default function InventoryPage() { +export default function EnergyPage() { return ( diff --git a/app/dashboard/operations/equipment/page.tsx b/app/dashboard/operations/equipment/page.tsx index a985a21..739f342 100644 --- a/app/dashboard/operations/equipment/page.tsx +++ b/app/dashboard/operations/equipment/page.tsx @@ -1,7 +1,7 @@ "use client"; -import EquipmentPortal from "@/components/dashboard/equipment" -export default function HelpDeskPage() { +import EquipmentPortal from "@/components/dashboard/operations/equipment" +export default function EquipmentPage() { return ( diff --git a/app/dashboard/operations/helpDesk/page.tsx b/app/dashboard/operations/helpDesk/page.tsx index b1ca4e4..c2e3d10 100644 --- a/app/dashboard/operations/helpDesk/page.tsx +++ b/app/dashboard/operations/helpDesk/page.tsx @@ -1,6 +1,6 @@ "use client"; -import HelpDeskPortal from "@/components/dashboard/helpDesk" +import HelpDeskPortal from "@/components/dashboard/operations/helpDesk" export default function HelpDeskPage() { return ( diff --git a/app/dashboard/operations/inventory/page.tsx b/app/dashboard/operations/inventory/page.tsx index b3c5e7a..c4fcaac 100644 --- a/app/dashboard/operations/inventory/page.tsx +++ b/app/dashboard/operations/inventory/page.tsx @@ -1,6 +1,6 @@ "use client" -import InventoryPortal from "@/components/dashboard/inventory"; +import InventoryPortal from "@/components/dashboard/operations/inventory"; export default function InventoryPage() { return ( diff --git a/app/dashboard/operations/request/page.tsx b/app/dashboard/operations/request/page.tsx index 6a0a071..499940f 100644 --- a/app/dashboard/operations/request/page.tsx +++ b/app/dashboard/operations/request/page.tsx @@ -1,6 +1,6 @@ "use client"; -import ServiceRequestsPortal from "@/components/dashboard/request" +import ServiceRequestsPortal from "@/components/dashboard/operations/request" export default function ServiceRequestPage() { return ( diff --git a/app/dashboard/operations/vendorFieldService/page.tsx b/app/dashboard/operations/vendorFieldService/page.tsx index fdecb65..d554225 100644 --- a/app/dashboard/operations/vendorFieldService/page.tsx +++ b/app/dashboard/operations/vendorFieldService/page.tsx @@ -1,9 +1,9 @@ "use client" -import VendorServicePortal from "@/components/dashboard/vendorService"; +import VendorServicePortal from "@/components/dashboard/operations/vendorService"; -export default function InventoryPage() { +export default function VendorPage() { return ( diff --git a/app/dashboard/operations/workPermit/page.tsx b/app/dashboard/operations/workPermit/page.tsx index cc2c821..de6b021 100644 --- a/app/dashboard/operations/workPermit/page.tsx +++ b/app/dashboard/operations/workPermit/page.tsx @@ -1,9 +1,9 @@ "use client" -import WorkPermitPortal from "@/components/dashboard/workpermit"; +import WorkPermitPortal from "@/components/dashboard/operations/workpermit"; -export default function InventoryPage() { +export default function WorkPermitPage() { return ( diff --git a/app/dashboard/overview/buildingOwner/page.tsx b/app/dashboard/overview/buildingOwner/page.tsx index 3640f80..b7e031c 100644 --- a/app/dashboard/overview/buildingOwner/page.tsx +++ b/app/dashboard/overview/buildingOwner/page.tsx @@ -2,10 +2,10 @@ -import BuildingOwnerPortal from "@/components/dashboard/buildingOwner"; +import BuildingOwnerPortal from "@/components/dashboard/overview/buildingOwner"; -export default function OverViewDashboardPage() { +export default function BuildingOwnerPage() { return ( diff --git a/app/dashboard/overview/dashboard/page.tsx b/app/dashboard/overview/dashboard/page.tsx index f434a14..c8d7774 100644 --- a/app/dashboard/overview/dashboard/page.tsx +++ b/app/dashboard/overview/dashboard/page.tsx @@ -2,7 +2,7 @@ -import OperationsDashboard from "@/components/dashboard/dashboard"; +import OperationsDashboard from "@/components/dashboard/overview/dashboard"; export default function OverViewDashboardPage() { diff --git a/app/dashboard/overview/engagement/page.tsx b/app/dashboard/overview/engagement/page.tsx index f5e3b0a..54eea39 100644 --- a/app/dashboard/overview/engagement/page.tsx +++ b/app/dashboard/overview/engagement/page.tsx @@ -1,6 +1,6 @@ "use client"; -import EngagementPage from "@/components/dashboard/engagement"; +import EngagementPage from "@/components/dashboard/overview/engagement"; export default function EngagementDashboard() { return ( diff --git a/app/dashboard/overview/propertyManager/page.tsx b/app/dashboard/overview/propertyManager/page.tsx index 6abd0ff..e9a9a96 100644 --- a/app/dashboard/overview/propertyManager/page.tsx +++ b/app/dashboard/overview/propertyManager/page.tsx @@ -1,8 +1,8 @@ "use client"; -import PropertyManagerPortal from "@/components/dashboard/propertyManager"; +import PropertyManagerPortal from "@/components/dashboard/overview/propertyManager"; -export default function EngagementDashboard() { +export default function PropertymanagerPage() { return ( diff --git a/app/dashboard/overview/serviceEngineer/page.tsx b/app/dashboard/overview/serviceEngineer/page.tsx index f0e6cbf..4ef0cf0 100644 --- a/app/dashboard/overview/serviceEngineer/page.tsx +++ b/app/dashboard/overview/serviceEngineer/page.tsx @@ -1,8 +1,8 @@ "use client"; -import ServiceEngineerPortal from "@/components/dashboard/serviceEngineer"; +import ServiceEngineerPortal from "@/components/dashboard/overview/serviceEngineer"; -export default function EngagementDashboard() { +export default function ServiceEngineerPage() { return ( diff --git a/app/dashboard/workplace/meetingRoom/page.tsx b/app/dashboard/workplace/meetingRoom/page.tsx index e69de29..8296ffa 100644 --- a/app/dashboard/workplace/meetingRoom/page.tsx +++ b/app/dashboard/workplace/meetingRoom/page.tsx @@ -0,0 +1,17 @@ +"use client" + +import MeetingRoomPortal from "@/components/dashboard/workplace/meetingRoom"; + + + +export default function MeetingPage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/workplace/visitorManagement/page.tsx b/app/dashboard/workplace/visitorManagement/page.tsx index f530919..8b45f13 100644 --- a/app/dashboard/workplace/visitorManagement/page.tsx +++ b/app/dashboard/workplace/visitorManagement/page.tsx @@ -1,9 +1,9 @@ "use client" -import VistiorManagementPortal from "@/components/dashboard/visitorManagement"; +import VistiorManagementPortal from "@/components/dashboard/workplace/visitorManagement"; -export default function InventoryPage() { +export default function VisitorPage() { return ( diff --git a/app/dashboard/workplace/workspace/page.tsx b/app/dashboard/workplace/workspace/page.tsx index e69de29..e931d05 100644 --- a/app/dashboard/workplace/workspace/page.tsx +++ b/app/dashboard/workplace/workspace/page.tsx @@ -0,0 +1,16 @@ +"use client" +import WorkSpacePortal from "@/components/dashboard/workplace/workspace"; + + + +export default function WorkSpacePage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/components/auth/authCard.tsx b/components/auth/authCard.tsx index 8786261..7d8f71e 100644 --- a/components/auth/authCard.tsx +++ b/components/auth/authCard.tsx @@ -4,7 +4,7 @@ import { useState } from "react"; import LoginForm from "./loginForm"; import VerifyCode from "./verifyCode"; import ForgotPassword from "./forgetPassword"; -import {Step} from "@/constants/types" +import {Step} from "@/types/types" diff --git a/components/auth/authlayout.tsx b/components/auth/authlayout.tsx index cefed2c..813ece5 100644 --- a/components/auth/authlayout.tsx +++ b/components/auth/authlayout.tsx @@ -1,4 +1,4 @@ -import { AuthLayoutProps } from "@/constants/types"; +import { AuthLayoutProps } from "@/types/types"; import LeftPanel from "./leftpanel"; diff --git a/utils/badge.tsx b/components/auth/badge.tsx similarity index 100% rename from utils/badge.tsx rename to components/auth/badge.tsx diff --git a/components/auth/forgetPassword.tsx b/components/auth/forgetPassword.tsx index e453cd1..2bcb631 100644 --- a/components/auth/forgetPassword.tsx +++ b/components/auth/forgetPassword.tsx @@ -1,8 +1,8 @@ -import FormInput from "@/utils/formInput"; -import Button from "@/utils/button"; +import FormInput from "@/components/common/formInput"; +import Button from "@/components/common/button"; -import {Props} from "@/constants/types" +import {Props} from "@/types/types" export default function ForgotPassword({ onBack }: Props) { diff --git a/components/auth/leftpanel.tsx b/components/auth/leftpanel.tsx index 29eb3be..8f24e52 100644 --- a/components/auth/leftpanel.tsx +++ b/components/auth/leftpanel.tsx @@ -1,6 +1,6 @@ "use client"; -import Badge from "@/utils/badge"; -import Stat from "@/utils/statCard"; +import Badge from "@/components/auth/badge"; +import Stat from "@/components/auth/statCard"; import { ShieldCheck, KeyRound, FileText } from "lucide-react"; diff --git a/components/auth/loginForm.tsx b/components/auth/loginForm.tsx index 4bca565..6a3e2b7 100644 --- a/components/auth/loginForm.tsx +++ b/components/auth/loginForm.tsx @@ -1,9 +1,9 @@ import { Eye,EyeOff } from "lucide-react"; -import FormInput from "@/utils/formInput"; -import Button from "@/utils/button"; +import FormInput from "@/components/common/formInput"; +import Button from "@/components/common/button"; import { useState } from "react"; -import {Props} from "@/constants/types" +import {Props} from "@/types/types" import { signIn } from "next-auth/react"; diff --git a/utils/statCard.tsx b/components/auth/statCard.tsx similarity index 100% rename from utils/statCard.tsx rename to components/auth/statCard.tsx diff --git a/components/auth/verifyCode.tsx b/components/auth/verifyCode.tsx index 2354ad5..d92c6a5 100644 --- a/components/auth/verifyCode.tsx +++ b/components/auth/verifyCode.tsx @@ -1,8 +1,8 @@ -import Button from "@/utils/button"; +import Button from "@/components/common/button"; import OTPInput from "./otpInput"; import { useEffect, useState, } from "react"; -import {Props} from "@/constants/types" +import {Props} from "@/types/types" export default function VerifyCode({ onBack }: Props) { diff --git a/utils/barchart.tsx b/components/charts/barchart.tsx similarity index 91% rename from utils/barchart.tsx rename to components/charts/barchart.tsx index e2109fd..67e3763 100644 --- a/utils/barchart.tsx +++ b/components/charts/barchart.tsx @@ -1,11 +1,9 @@ -import {BarChartProps} from "@/constants/types"; +import {BarChartProps} from "@/types/types"; export default function BarChart({ data }: BarChartProps) { - return ( - - + return (
{/* Bars */} diff --git a/utils/progressBarRow.tsx b/components/charts/progressBarRow.tsx similarity index 92% rename from utils/progressBarRow.tsx rename to components/charts/progressBarRow.tsx index d01bc05..edb12ee 100644 --- a/utils/progressBarRow.tsx +++ b/components/charts/progressBarRow.tsx @@ -1,5 +1,5 @@ -import { ProgressBarProps } from "@/constants/types"; +import { ProgressBarProps } from "@/types/types"; export function ProgressBarRow({ label, value, maxValue }: ProgressBarProps) { const percentage = (value / maxValue) * 100; diff --git a/utils/statusProgressRow.tsx b/components/charts/statusProgressRow.tsx similarity index 92% rename from utils/statusProgressRow.tsx rename to components/charts/statusProgressRow.tsx index 79f92bb..4652521 100644 --- a/utils/statusProgressRow.tsx +++ b/components/charts/statusProgressRow.tsx @@ -1,5 +1,5 @@ -import { StatusProgressProps } from "@/constants/types"; +import { StatusProgressProps } from "@/types/types"; export function StatusProgressRow({ label, value, total, barColor = "bg-[#17cbb5]" }: StatusProgressProps) { const percentage = (value / total) * 100; diff --git a/utils/button.tsx b/components/common/button.tsx similarity index 79% rename from utils/button.tsx rename to components/common/button.tsx index dd22ded..2b4f548 100644 --- a/utils/button.tsx +++ b/components/common/button.tsx @@ -1,4 +1,4 @@ -import { ButtonProps } from "@/constants/types"; +import { ButtonProps } from "@/types/types"; export default function Button({ diff --git a/utils/cardHeader.tsx b/components/common/cardHeader.tsx similarity index 100% rename from utils/cardHeader.tsx rename to components/common/cardHeader.tsx diff --git a/utils/cardWrapper.tsx b/components/common/cardWrapper.tsx similarity index 100% rename from utils/cardWrapper.tsx rename to components/common/cardWrapper.tsx diff --git a/utils/dashStatCard.tsx b/components/common/dashStatCard.tsx similarity index 97% rename from utils/dashStatCard.tsx rename to components/common/dashStatCard.tsx index 7c42d35..9c48f61 100644 --- a/utils/dashStatCard.tsx +++ b/components/common/dashStatCard.tsx @@ -1,4 +1,4 @@ -import { StatCardProps } from "@/constants/types"; +import { StatCardProps } from "@/types/types"; import { colorMap } from "@/constants/constant"; export default function StatCard({ diff --git a/utils/dataTable.tsx b/components/common/dataTable.tsx similarity index 100% rename from utils/dataTable.tsx rename to components/common/dataTable.tsx diff --git a/utils/formInput.tsx b/components/common/formInput.tsx similarity index 90% rename from utils/formInput.tsx rename to components/common/formInput.tsx index 1e52d19..11b6d15 100644 --- a/utils/formInput.tsx +++ b/components/common/formInput.tsx @@ -1,5 +1,5 @@ -import { FormProps } from "@/constants/types"; +import { FormProps } from "@/types/types"; export default function FormInput({ label, value, diff --git a/utils/infoBanner.tsx b/components/common/infoBanner.tsx similarity index 90% rename from utils/infoBanner.tsx rename to components/common/infoBanner.tsx index 64e4fa7..8450854 100644 --- a/utils/infoBanner.tsx +++ b/components/common/infoBanner.tsx @@ -1,6 +1,6 @@ -import {InfoBannerProps} from "@/constants/types"; +import {InfoBannerProps} from "@/types/types"; export default function InfoBanner({ boldText, diff --git a/utils/roundedFilters.tsx b/components/common/roundedFilters.tsx similarity index 96% rename from utils/roundedFilters.tsx rename to components/common/roundedFilters.tsx index 1e7d1d2..5d67f4a 100644 --- a/utils/roundedFilters.tsx +++ b/components/common/roundedFilters.tsx @@ -1,4 +1,4 @@ -import { FilterTabsProps } from "@/constants/types"; +import { FilterTabsProps } from "@/types/types"; export default function FilterTabs({ options = [], diff --git a/utils/tabs.tsx b/components/common/tabs.tsx similarity index 92% rename from utils/tabs.tsx rename to components/common/tabs.tsx index 112bdd1..4a3ab4c 100644 --- a/utils/tabs.tsx +++ b/components/common/tabs.tsx @@ -1,4 +1,4 @@ -import { NavigationTabsProps } from "@/constants/types"; +import { NavigationTabsProps } from "@/types/types"; diff --git a/components/dashboard/finance/budget.tsx b/components/dashboard/finance/budget.tsx new file mode 100644 index 0000000..6a64f51 --- /dev/null +++ b/components/dashboard/finance/budget.tsx @@ -0,0 +1,201 @@ +import { + Database, + FileText, + Activity, + AlertTriangle, + Plus +} from "lucide-react"; + +import InfoBanner from "@/components/common/infoBanner"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import { Card } from '@/components/common/cardWrapper'; +import { CardHeader } from '@/components/common/cardHeader'; +import { approvalQueueData, categoryData } from "@/constants/constant"; + + + +export default function BudgetPortal() { + return ( +
+ {/* --- HEADER SECTION WITH BUTTONS --- */} +
+
+
+ Apple One — HQ Tower + + FINANCE + + O&M BUDGET +
+ +

+ O&M budget management +

+ +

+ Multi-dimensional budgets by site, department and asset — planned vs actual, variance, approvals and overrun alerts. +

+
+ + {/* --- HEADER BUTTONS --- */} +
+ + + +
+
+ + {/* --- STAT CARDS --- */} +
+ {/* Annual budget */} + + + {/* Spent YTD */} + + + {/* Remaining */} + + + {/* Overrun lines */} + +
+ + {/* --- BUDGET DETAILS & APPROVAL QUEUE SECTION --- */} +
+ {/* Planned vs Actual Table (Left 2 Columns) */} + + + +
+ + + + + + + + + + + + + {categoryData.map((row, idx) => ( + + + + + + + + + ))} + +
CategoryTypePlannedActualVarianceUtilization
+ {row.category} + + + {row.type} + + + {row.planned} + + {row.actual} + + {row.variance} + +
+
+
+ + {row.utilization}% + +
+
+
+ + {/* Approval Queue Panel (Right 1 Column) */} + + + +
+ {approvalQueueData.map((item) => ( +
+
+

+ {item.title} +

+

+ {item.id} · {item.meta} +

+
+ + {item.status === "pending" ? ( + + ) : ( + + + COMPLETED + + )} +
+ ))} +
+
+
+ + {/* Info Banner */} +
+ +
+
+ ); +} \ No newline at end of file diff --git a/components/dashboard/finance/costInvoice.tsx b/components/dashboard/finance/costInvoice.tsx new file mode 100644 index 0000000..b1024e9 --- /dev/null +++ b/components/dashboard/finance/costInvoice.tsx @@ -0,0 +1,298 @@ +import { + FileText, + Database, + AlertTriangle, + Activity, + Sparkles, + Plus +} from "lucide-react"; + +import InfoBanner from "@/components/common/infoBanner"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import Table from "@/components/common/dataTable"; + +const StatusBadge = ({ + text, + color, +}: { + text: string; + color: string; +}) => ( + + + {text} + +); + +const ActionButton = ({ text }: { text: string }) => ( + +); + +const headers = [ + "Invoice", + "Client", + "Period", + "Amount", + "Raised", + "Due", + "Status", + "", +]; + +const rows = [ + [ + INV-9040, + Apple One Corp, + "Jun 2026", + ₹12.4 L, + Jun 5, 2026, + Jul 5, 2026, + , + , + ], + + [ + INV-9041, + Novotel F&B, + "Jun 2026", + ₹8.6 L, + Jun 9, 2026, + Jul 9, 2026, + , + , + ], + + [ + INV-9042, + SRM Estates, + "Jun 2026", + ₹4.3 L, + Jun 13, 2026, + Jul 13, 2026, + , + , + ], + + [ + INV-9043, + Local Mart, + "Jun 2026", + ₹21.0 L, + Jun 17, 2026, + Jul 17, 2026, + , + , + ], + + [ + INV-9044, + Regus Spaces, + "Jun 2026", + ₹6.8 L, + Jun 21, 2026, + Jul 21, 2026, + , + , + ], + + [ + INV-9105, + Apple One Corp, + "Jun 2026", + ₹12.4 L, + Jun 5, 2026, + Jul 5, 2026, + , + , + ], + + [ + INV-9106, + Novotel F&B, + "Jun 2026", + ₹8.6 L, + Jun 9, 2026, + Jul 9, 2026, + , + , + ], + + [ + INV-9107, + SRM Estates, + "Jun 2026", + ₹4.3 L, + Jun 13, 2026, + Jul 13, 2026, + , + , + ], + + [ + INV-9108, + Local Mart, + "Jun 2026", + ₹21.0 L, + Jun 17, 2026, + Jul 17, 2026, + , + , + ], + [ + INV-9107, + SRM Estates, + "Jun 2026", + ₹4.3 L, + Jun 13, 2026, + Jul 13, 2026, + , + , + ], + + [ + INV-9108, + Local Mart, + "Jun 2026", + ₹21.0 L, + Jun 17, 2026, + Jul 17, 2026, + , + , + ], +]; +export default function CostInvoicePortal() { + return ( +
+ {/* --- HEADER SECTION WITH BUTTONS --- */} +
+
+
+ Apple One — HQ Tower + + FINANCE + + COSTING & INVOICING +
+ +

+ Client costing & auto-invoicing +

+ +

+ Client-wise costing setup, automatic project approval and invoice generation — fully native, no external dependency. +

+
+ + {/* --- HEADER BUTTONS --- */} +
+ + + +
+
+ + {/* --- STAT CARDS --- */} +
+ {/* Billed */} + + + {/* Outstanding */} + + + {/* Overdue */} + + + {/* Collection rate */} + +
+ +
+ + + {/* Info Banner */} +
+ +
+ + ); +} \ No newline at end of file diff --git a/components/dashboard/insight/reports.tsx b/components/dashboard/insight/reports.tsx new file mode 100644 index 0000000..062ab80 --- /dev/null +++ b/components/dashboard/insight/reports.tsx @@ -0,0 +1,182 @@ +import { useState } from 'react'; +import { Plus, Download } from 'lucide-react'; +import Button from "@/components/common/button"; +import NavigationTabs from '@/components/common/tabs'; +import { reportFilters, reporttabs, Reqeusttabs, statusFilters } from '@/constants/constant'; +import FilterTabs from '@/components/common/roundedFilters'; +import Table from '@/components/common/dataTable'; + + +const StatusBadge = ({ + text, + color, +}: { + text: string; + color: string; +}) => ( + + + {text} + +); + +const headers = [ + "Code", + "Equipment", + "Group", + "Block · Floor", + "Service Provider", + "Manufacturer", + "Model", +]; + +const rows = [ + [ + APP-1100, + Cooling Tower, + "Electrical", + "Block 1 · 2", + "Blue Star", + "Kirloskar", + M-550, + ], + + [ + APP-1103, + Air Handling Unit, + "Plumbing", + "Tower A · 1", + "Blue Star", + "Voltas", + M-550, + ], + + [ + APP-1106, + VRV Outdoor, + "Electrical", + "Tower A · G", + "Voltas", + "Daikin", + M-320, + ], + + [ + APP-1109, + VRV Outdoor, + "HVAC", + "Tower A · 1", + "Voltas", + "Blue Star", + M-320, + ], + + [ + APP-1112, + Air Handling Unit, + "HVAC", + "Tower A · G", + "In-house", + "Voltas", + M-550, + ], + + [ + APP-1115, + Air Handling Unit, + "Electrical", + "Tower A · 2", + "Voltas", + "Daikin", + M-XR9, + ], + + [ + APP-1118, + Chiller, + "Electrical", + "Block 1 · 1", + "In-house", + "Blue Star", + M-XR9, + ], + + [ + APP-1121, + Cooling Tower, + "Plumbing", + "Tower A · 1", + "Blue Star", + "Daikin", + M-550, + ], +]; + +export default function ReportPortal() { + const [activeTab, setActiveTab] = useState('Equipment'); + const [activeFilter, setActiveFilter] = useState('Site All'); + + const handleDownload = () => { + // Add your export/download logic here + console.log("Downloading report..."); + }; + + return ( +
+ {/* --- HEADER SECTION --- */} +
+
+
+ Apple One — HQ Tower + + INSIGHT + + REPORTS +
+

+ Reports & MMR +

+

+ A read-only layer over every module — filter, visualise, and export. Never on the write path. +

+
+
+ + {/* --- NAVIGATION TABS & TOP ACTION BUTTONS --- */} +
+ {/* Navigation Tabs */} + +
+ + {/* --- STATUS PILL FILTERS & DOWNLOAD BUTTON --- */} +
+ + + +
+ +
+
+ + + + ); +} \ No newline at end of file diff --git a/components/dashboard/energy.tsx b/components/dashboard/operations/energy.tsx similarity index 98% rename from components/dashboard/energy.tsx rename to components/dashboard/operations/energy.tsx index c38f502..09d02a0 100644 --- a/components/dashboard/energy.tsx +++ b/components/dashboard/operations/energy.tsx @@ -6,8 +6,8 @@ import { LayoutGrid, Plus } from "lucide-react"; -import Button from "@/utils/button"; -import StatCard from "@/utils/dashStatCard"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; diff --git a/components/dashboard/equipment.tsx b/components/dashboard/operations/equipment.tsx similarity index 74% rename from components/dashboard/equipment.tsx rename to components/dashboard/operations/equipment.tsx index 8ed2d71..31ce795 100644 --- a/components/dashboard/equipment.tsx +++ b/components/dashboard/operations/equipment.tsx @@ -12,12 +12,13 @@ import { LayoutGrid, } from "lucide-react"; -import Table from "@/utils/dataTable"; -import InfoBanner from "@/utils/infoBanner"; -import Button from "@/utils/button"; -import NavigationTabs from "@/utils/tabs"; +import Table from "@/components/common/dataTable"; +import InfoBanner from "@/components/common/infoBanner"; +import Button from "@/components/common/button"; +import NavigationTabs from "@/components/common/tabs"; import { equipmentTabs } from "@/constants/constant"; import { useState } from "react"; +import StatCard from "@/components/common/dashStatCard"; const headers = [ "Code", @@ -189,64 +190,51 @@ export default function EquipmentPortal() { className="mb-6" /> - {/* --- STAT CARDS (4 CARDS MATCHING SCREENSHOT) --- */}
- {/* Total equipment */} -
-
-
- -
- 4 groups -
-
-
8
-
Total equipment
-
-
+ {/* Total equipment */} + - {/* Critical assets */} -
-
-
- -
- priority -
-
-
4
-
Critical assets
-
-
+ {/* Critical assets */} + - {/* PPM attention */} -
-
-
- -
- due / overdue -
-
-
3
-
PPM attention
-
-
+ {/* PPM attention */} + - {/* On plan */} -
-
-
- -
- healthy -
-
-
5
-
On plan
-
-
-
+ {/* On plan */} + + {/* --- ROW 2: SEARCH, FILTERS & ACTION BUTTONS --- */}
diff --git a/components/dashboard/helpDesk.tsx b/components/dashboard/operations/helpDesk.tsx similarity index 98% rename from components/dashboard/helpDesk.tsx rename to components/dashboard/operations/helpDesk.tsx index e5dc16d..9a2fb7d 100644 --- a/components/dashboard/helpDesk.tsx +++ b/components/dashboard/operations/helpDesk.tsx @@ -11,10 +11,10 @@ import { Pencil, Plus, } from 'lucide-react'; -import Button from "@/utils/button"; -import StatCard from "@/utils/dashStatCard"; -import Table from "@/utils/dataTable"; -import NavigationTabs from '@/utils/tabs'; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import Table from "@/components/common/dataTable"; +import NavigationTabs from '@/components/common/tabs'; import { helpdeskTtabs } from '@/constants/constant'; const StatusBadge = ({ diff --git a/components/dashboard/inventory.tsx b/components/dashboard/operations/inventory.tsx similarity index 98% rename from components/dashboard/inventory.tsx rename to components/dashboard/operations/inventory.tsx index bb72548..f8c22a1 100644 --- a/components/dashboard/inventory.tsx +++ b/components/dashboard/operations/inventory.tsx @@ -6,9 +6,9 @@ import { LayoutGrid, Plus } from "lucide-react"; -import Button from "@/utils/button"; -import StatCard from "@/utils/dashStatCard"; -import InfoBanner from "@/utils/infoBanner"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import InfoBanner from "@/components/common/infoBanner"; diff --git a/components/dashboard/request.tsx b/components/dashboard/operations/request.tsx similarity index 96% rename from components/dashboard/request.tsx rename to components/dashboard/operations/request.tsx index 24230fb..4d13498 100644 --- a/components/dashboard/request.tsx +++ b/components/dashboard/operations/request.tsx @@ -1,11 +1,11 @@ import { useState } from 'react'; import { Plus } from 'lucide-react'; -import Button from "@/utils/button"; -import LocationTable from '@/utils/dataTable'; -import NavigationTabs from '@/utils/tabs'; +import Button from "@/components/common/button"; +import LocationTable from '@/components/common/dataTable'; +import NavigationTabs from '@/components/common/tabs'; import { Reqeusttabs,statusFilters } from '@/constants/constant'; -import FilterTabs from '@/utils/roundedFilters'; -import Table from '@/utils/dataTable'; +import FilterTabs from '@/components/common/roundedFilters'; +import Table from '@/components/common/dataTable'; const StatusBadge = ({ diff --git a/components/dashboard/vendorService.tsx b/components/dashboard/operations/vendorService.tsx similarity index 98% rename from components/dashboard/vendorService.tsx rename to components/dashboard/operations/vendorService.tsx index 3fe9087..a5ee5f3 100644 --- a/components/dashboard/vendorService.tsx +++ b/components/dashboard/operations/vendorService.tsx @@ -7,9 +7,9 @@ import { BarChart2, Plus } from "lucide-react"; -import Button from "@/utils/button"; -import StatCard from "@/utils/dashStatCard"; -import InfoBanner from "@/utils/infoBanner"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import InfoBanner from "@/components/common/infoBanner"; export default function VendorServicePortal() { const vendorData = [ diff --git a/components/dashboard/workpermit.tsx b/components/dashboard/operations/workpermit.tsx similarity index 98% rename from components/dashboard/workpermit.tsx rename to components/dashboard/operations/workpermit.tsx index f402ea8..2a2bde7 100644 --- a/components/dashboard/workpermit.tsx +++ b/components/dashboard/operations/workpermit.tsx @@ -1,13 +1,13 @@ import { useState } from 'react'; import { Plus, ShieldCheck, Clock, Check, AlertTriangle, QrCode, FileText, Eye } from 'lucide-react'; -import Button from "@/utils/button"; +import Button from "@/components/common/button"; import { workPermitFilters } from '@/constants/constant'; -import FilterTabs from '@/utils/roundedFilters'; -import StatCard from '@/utils/dashStatCard'; -import InfoBanner from '@/utils/infoBanner'; +import FilterTabs from '@/components/common/roundedFilters'; +import StatCard from '@/components/common/dashStatCard'; +import InfoBanner from '@/components/common/infoBanner'; export default function WorkPermitPortal() { - const [activeTab, setActiveTab] = useState('TFM Requests'); + const [activeFilter, setActiveFilter] = useState('All'); // Permit Data matching the UI diff --git a/components/dashboard/activityFeed.tsx b/components/dashboard/overview/activityFeed.tsx similarity index 94% rename from components/dashboard/activityFeed.tsx rename to components/dashboard/overview/activityFeed.tsx index acf44e4..9beaa1c 100644 --- a/components/dashboard/activityFeed.tsx +++ b/components/dashboard/overview/activityFeed.tsx @@ -1,4 +1,4 @@ -import { ActivityFeedProps } from "@/constants/types" +import { ActivityFeedProps } from "@/types/types" diff --git a/components/dashboard/buildingOwner.tsx b/components/dashboard/overview/buildingOwner.tsx similarity index 91% rename from components/dashboard/buildingOwner.tsx rename to components/dashboard/overview/buildingOwner.tsx index 084accc..6225078 100644 --- a/components/dashboard/buildingOwner.tsx +++ b/components/dashboard/overview/buildingOwner.tsx @@ -1,14 +1,14 @@ import { Building2, ShieldCheck, Database, Leaf, FileSpreadsheet } from "lucide-react"; -import StatCard from "@/utils/dashStatCard"; +import StatCard from "@/components/common/dashStatCard"; import { energyData } from "@/constants/constant"; -import BarChart from "@/utils/barchart"; -import InfoBanner from "@/utils/infoBanner"; -import Button from "@/utils/button"; -import { ProgressBarRow } from "@/utils/progressBarRow"; +import BarChart from "@/components/charts/barchart"; +import InfoBanner from "@/components/common/infoBanner"; +import Button from "@/components/common/button"; +import { ProgressBarRow } from "@/components/charts/progressBarRow"; // Import your custom Card components -import { Card } from "@/utils/cardWrapper"; -import { CardHeader } from "@/utils/cardHeader"; +import { Card } from "@/components/common/cardWrapper"; +import { CardHeader } from "@/components/common/cardHeader"; export default function BuildingOwnerPortal() { return ( diff --git a/components/dashboard/dashboard.tsx b/components/dashboard/overview/dashboard.tsx similarity index 95% rename from components/dashboard/dashboard.tsx rename to components/dashboard/overview/dashboard.tsx index 8adb143..3fd303a 100644 --- a/components/dashboard/dashboard.tsx +++ b/components/dashboard/overview/dashboard.tsx @@ -1,13 +1,13 @@ import { Check } from 'lucide-react'; -import BarChart from "@/utils/barchart"; -import StatCard from "@/utils/dashStatCard"; -import ActivityFeed from "@/components/dashboard/activityFeed"; +import BarChart from "@/components/charts/barchart"; +import StatCard from "@/components/common/dashStatCard"; +import ActivityFeed from "@/components/dashboard/overview/activityFeed"; import {activities, chartData} from "@/constants/constant" -import { Card } from '@/utils/cardWrapper'; -import {CardHeader} from '@/utils/cardHeader'; -import {ProgressBarRow }from '@/utils/progressBarRow'; -import {StatusProgressRow} from '@/utils/statusProgressRow'; +import { Card } from '@/components/common/cardWrapper'; +import {CardHeader} from '@/components/common/cardHeader'; +import {ProgressBarRow }from '@/components/charts/progressBarRow'; +import {StatusProgressRow} from '@/components/charts/statusProgressRow'; export default function Dashboard() { diff --git a/components/dashboard/engagement.tsx b/components/dashboard/overview/engagement.tsx similarity index 96% rename from components/dashboard/engagement.tsx rename to components/dashboard/overview/engagement.tsx index cf41d98..1169cd5 100644 --- a/components/dashboard/engagement.tsx +++ b/components/dashboard/overview/engagement.tsx @@ -8,13 +8,13 @@ import { } from "lucide-react"; import { SATISFACTION_DRIVERS, TICKETS_DATA } from "@/constants/constant"; -import StatCard from "../../utils/dashStatCard"; -import Button from "@/utils/button"; -import InfoBanner from "@/utils/infoBanner"; +import StatCard from "../../common/dashStatCard"; +import Button from "@/components/common/button"; +import InfoBanner from "@/components/common/infoBanner"; // Import your custom Card components -import { Card } from "@/utils/cardWrapper"; -import { CardHeader } from "@/utils/cardHeader"; +import { Card } from "@/components/common/cardWrapper"; +import { CardHeader } from "@/components/common/cardHeader"; export default function EngagementPage() { return ( diff --git a/components/dashboard/propertyManager.tsx b/components/dashboard/overview/propertyManager.tsx similarity index 94% rename from components/dashboard/propertyManager.tsx rename to components/dashboard/overview/propertyManager.tsx index 152da84..180d648 100644 --- a/components/dashboard/propertyManager.tsx +++ b/components/dashboard/overview/propertyManager.tsx @@ -1,7 +1,7 @@ -import Button from "@/utils/button"; -import StatCard from "@/utils/dashStatCard"; -import InfoBanner from "@/utils/infoBanner"; -import { ProgressBarRow } from "@/utils/progressBarRow"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import InfoBanner from "@/components/common/infoBanner"; +import { ProgressBarRow } from "@/components/charts/progressBarRow"; import { FileText, Wrench, @@ -12,8 +12,8 @@ import { } from "lucide-react"; // Import your custom Card components -import { Card } from "@/utils/cardWrapper"; -import { CardHeader } from "@/utils/cardHeader"; +import { Card } from "@/components/common/cardWrapper"; +import { CardHeader } from "@/components/common/cardHeader"; export default function PropertyManagerPortal() { diff --git a/components/dashboard/serviceEngineer.tsx b/components/dashboard/overview/serviceEngineer.tsx similarity index 97% rename from components/dashboard/serviceEngineer.tsx rename to components/dashboard/overview/serviceEngineer.tsx index 9e92a85..ad7bf4d 100644 --- a/components/dashboard/serviceEngineer.tsx +++ b/components/dashboard/overview/serviceEngineer.tsx @@ -1,6 +1,6 @@ -import Button from "@/utils/button"; -import StatCard from "@/utils/dashStatCard"; -import InfoBanner from "@/utils/infoBanner"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import InfoBanner from "@/components/common/infoBanner"; import { FileText, Wrench, @@ -11,8 +11,8 @@ import { } from "lucide-react"; // Import your custom Card components -import { Card } from "@/utils/cardWrapper"; -import { CardHeader } from "@/utils/cardHeader"; +import { Card } from "@/components/common/cardWrapper"; +import { CardHeader } from "@/components/common/cardHeader"; export default function ServiceEngineerPortal() { return ( diff --git a/components/dashboard/workplace/meetingRoom.tsx b/components/dashboard/workplace/meetingRoom.tsx new file mode 100644 index 0000000..68679a3 --- /dev/null +++ b/components/dashboard/workplace/meetingRoom.tsx @@ -0,0 +1,179 @@ +import { useState } from 'react'; +import { + Calendar, + Clock, + Activity, + Check, + Plus, + Pencil, + Trash2 +} from "lucide-react"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import { roomData, scheduleData } from '@/constants/constant'; +import { Card } from '@/components/common/cardWrapper'; +import { CardHeader } from '@/components/common/cardHeader'; + +// Your Card Comp + +export default function MeetingRoomPortal() { + return ( +
+ {/* --- HEADER SECTION --- */} +
+
+
+ Apple One — HQ Tower + + WORKPLACE + + MEETING ROOMS +
+

+ Meeting room booking +

+

+ Real-time availability, calendar-synced reservations, room services and utilization analytics. +

+
+ + {/* --- HEADER BUTTONS --- */} +
+ + + + + +
+
+ + {/* --- STAT CARDS --- */} +
+ {/* Available now */} + + + {/* In use now */} + + + {/* Utilization */} + + + {/* Bookings today */} + +
+ + {/* --- MAIN CONTENT UI (ADDED BELOW STAT CARDS) --- */} +
+ {/* Room List (Left 2 Columns) */} +
+ {roomData.map((room) => ( + +
+ {/* Header info inside room card */} +
+
+

{room.name}

+

{room.location}

+
+ + + {room.status} + +
+ + {/* Feature Tags */} +
+ {room.tags.map((tag, idx) => ( + + {tag} + + ))} +
+
+ + {/* Bottom Info & Action Buttons */} +
+ {room.subtitle} +
+ + + +
+
+
+ ))} +
+ + {/* Today's Schedule Timeline (Right 1 Column) */} +
+ + +
+ {scheduleData.map((item, idx) => ( +
+ {/* Timeline dot */} + + + {/* Event Details */} +

+ {item.room} • {item.title} +

+

+ {item.time} {item.status} +

+
+ ))} +
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/components/dashboard/visitorManagement.tsx b/components/dashboard/workplace/visitorManagement.tsx similarity index 97% rename from components/dashboard/visitorManagement.tsx rename to components/dashboard/workplace/visitorManagement.tsx index 93f97c8..0f474cb 100644 --- a/components/dashboard/visitorManagement.tsx +++ b/components/dashboard/workplace/visitorManagement.tsx @@ -7,12 +7,12 @@ import { BarChart2, Plus } from "lucide-react"; -import Button from "@/utils/button"; -import StatCard from "@/utils/dashStatCard"; -import InfoBanner from "@/utils/infoBanner"; -import FilterTabs from '@/utils/roundedFilters'; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import InfoBanner from "@/components/common/infoBanner"; +import FilterTabs from '@/components/common/roundedFilters'; import { visitorFilters } from '@/constants/constant'; -import Table from '@/utils/dataTable'; +import Table from '@/components/common/dataTable'; export default function VistiorManagementPortal() { const headers = [ diff --git a/components/dashboard/workplace/workspace.tsx b/components/dashboard/workplace/workspace.tsx new file mode 100644 index 0000000..e4fdf39 --- /dev/null +++ b/components/dashboard/workplace/workspace.tsx @@ -0,0 +1,218 @@ +import { + Activity, + Monitor, + Clock, + ShieldCheck, + Pencil, + Trash2, + Sparkles, + Plus +} from "lucide-react"; + +import InfoBanner from "@/components/common/infoBanner"; +import Button from "@/components/common/button"; +import NavigationTabs from "@/components/common/tabs"; + +import { useState } from "react"; +import { workspaceTabs, zoneUtilizationData } from "@/constants/constant"; +import StatCard from "@/components/common/dashStatCard"; +import { Card } from '@/components/common/cardWrapper'; +import { CardHeader } from '@/components/common/cardHeader'; + +export default function WorkSpacePortal() { + const [activeTab, setActiveTab] = useState("Desk Booking"); + + // Grid state matching the UI: 4 rows x 12 columns (48 seats) + // Types: 'occupied' (red/purple outline), 'free' (teal), 'reserved' (amber) + const deskGrid = Array.from({ length: 48 }).map((_, index) => { + if (index === 42) return "reserved"; // 1 Reserved desk + if (index >= 36) return "free"; // Free desks on the bottom row + return "occupied"; // Occupied desks + }); + + return ( +
+ {/* --- HEADER SECTION WITH BUTTONS --- */} +
+
+
+ Apple One — HQ Tower + + WORKPLACE + + WORKSPACE +
+ +

+ Workspace management +

+ +

+ Desk booking, live floor plans and shift timetable — unified, all reading the Block → Floor → Zone master. +

+
+ + {/* --- ACTION BUTTONS --- */} +
+ + + + + +
+
+ + {/* Navigation Tabs */} + + + {/* --- STAT CARDS --- */} +
+ {/* Total desks */} + + + {/* Available */} + + + {/* Occupied */} + + + {/* Utilization */} + +
+ + {/* --- OCCUPANCY & ZONE UTILIZATION SECTION --- */} +
+ {/* Live Occupancy Grid (Left 2 Columns) */} + + + + {/* Desk Layout Grid */} +
+ {deskGrid.map((type, i) => ( +
+ ))} +
+ + {/* Map Legend */} +
+
+ + Free +
+
+ + Reserved +
+
+ + Occupied +
+
+ + + {/* Zone Utilization Bars (Right 1 Column) */} + + + +
+ {zoneUtilizationData.map((zone, idx) => { + const percentage = Math.round((zone.current / zone.max) * 100); + return ( +
+ + {zone.name} + + + {/* Progress Bar Container */} +
+
+
+ + {/* Value & Actions */} +
+ {zone.current}/{zone.max} + + +
+
+ ); + })} +
+ +
+ + {/* Info Banner */} +
+ +
+
+ ); +} \ No newline at end of file diff --git a/utils/navbar.tsx b/components/layouts/navbar.tsx similarity index 100% rename from utils/navbar.tsx rename to components/layouts/navbar.tsx diff --git a/utils/sideBarItem.tsx b/components/layouts/sideBarItem.tsx similarity index 63% rename from utils/sideBarItem.tsx rename to components/layouts/sideBarItem.tsx index f142b20..96c09ab 100644 --- a/utils/sideBarItem.tsx +++ b/components/layouts/sideBarItem.tsx @@ -3,8 +3,8 @@ import Link from "next/link"; import { useState } from "react"; import { ChevronDown } from "lucide-react"; -import {Props} from "@/constants/types"; -import Button from "@/utils/button"; +import {Props} from "@/types/types"; +import Button from "@/components/common/button"; export default function SidebarItem({ item }: Props) { const [open, setOpen] = useState(item.title === "Overview"); @@ -13,16 +13,17 @@ export default function SidebarItem({ item }: Props) {
-

Tenant runtime

-
+
{SIDEBAR_ITEMS.map((item) => (