diff --git a/app/dashboard/compliance-safety/auditAndSurvey/page.tsx b/app/dashboard/compliance-safety/auditAndSurvey/page.tsx new file mode 100644 index 0000000..fb4c55d --- /dev/null +++ b/app/dashboard/compliance-safety/auditAndSurvey/page.tsx @@ -0,0 +1,23 @@ +"use client" + +import AuditSurveyPortal from "@/components/dashboard/compliance/auditAndSurvey"; + + + + + + + + + +export default function AuditSurveyPage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/compliance-safety/contracts/page.tsx b/app/dashboard/compliance-safety/contracts/page.tsx new file mode 100644 index 0000000..c70c69b --- /dev/null +++ b/app/dashboard/compliance-safety/contracts/page.tsx @@ -0,0 +1,20 @@ +"use client" + +import ContractsPortal from "@/components/dashboard/compliance/contracts"; + + + + + + +export default function ContractsPage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/compliance-safety/fireAndSafety/page.tsx b/app/dashboard/compliance-safety/fireAndSafety/page.tsx new file mode 100644 index 0000000..3dfdff3 --- /dev/null +++ b/app/dashboard/compliance-safety/fireAndSafety/page.tsx @@ -0,0 +1,22 @@ +"use client" + +import FireSafetyPortal from "@/components/dashboard/compliance/fireAndSafety"; + + + + + + + + +export default function FireSafetyPage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/compliance-safety/statutoryCompliance/page.tsx b/app/dashboard/compliance-safety/statutoryCompliance/page.tsx new file mode 100644 index 0000000..a9e1ee3 --- /dev/null +++ b/app/dashboard/compliance-safety/statutoryCompliance/page.tsx @@ -0,0 +1,19 @@ +"use client" + +import StatutoryCompliancePortal from "@/components/dashboard/compliance/statutoryCompliance"; + + + + + +export default function ComplianceSafetyPage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/compliance-safety/training/page.tsx b/app/dashboard/compliance-safety/training/page.tsx new file mode 100644 index 0000000..5f5ca99 --- /dev/null +++ b/app/dashboard/compliance-safety/training/page.tsx @@ -0,0 +1,22 @@ +"use client" + +import TrainingPortal from "@/components/dashboard/compliance/training"; + + + + + + + + +export default function TrainingPage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/compliance-safety/wasteAndEsg/page.tsx b/app/dashboard/compliance-safety/wasteAndEsg/page.tsx new file mode 100644 index 0000000..c3a81fa --- /dev/null +++ b/app/dashboard/compliance-safety/wasteAndEsg/page.tsx @@ -0,0 +1,22 @@ +"use client" + +import WasteESGPortal from "@/components/dashboard/compliance/wasteAndEsg"; + + + + + + + + +export default function WasteEsGPage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/intelligence/aiPredictive/page.tsx b/app/dashboard/intelligence/aiPredictive/page.tsx new file mode 100644 index 0000000..173e037 --- /dev/null +++ b/app/dashboard/intelligence/aiPredictive/page.tsx @@ -0,0 +1,20 @@ +"use client" + +import AiPredictivePortal from "@/components/dashboard/intelligence/aiAndPredictive"; + + + + + + +export default function AiPredictivePage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/intelligence/assetHealth/page.tsx b/app/dashboard/intelligence/assetHealth/page.tsx new file mode 100644 index 0000000..be229bd --- /dev/null +++ b/app/dashboard/intelligence/assetHealth/page.tsx @@ -0,0 +1,21 @@ +"use client" + + +import AssetHealthPortal from "@/components/dashboard/intelligence/assetHealth"; + + + + + + +export default function AssetHealthPage() { + return ( + + +
+ + +
+ + ); +} \ No newline at end of file diff --git a/app/dashboard/layout.tsx b/app/dashboard/layout.tsx index 830652a..c75d24c 100644 --- a/app/dashboard/layout.tsx +++ b/app/dashboard/layout.tsx @@ -9,7 +9,7 @@ export default function DashboardLayout({ children: React.ReactNode; }) { return ( -
+
{/* Shared Sidebar */} diff --git a/components/common/actionButton.tsx b/components/common/actionButton.tsx new file mode 100644 index 0000000..54d0cec --- /dev/null +++ b/components/common/actionButton.tsx @@ -0,0 +1,35 @@ +import { List, Pencil, Power, QrCode, ShieldCheck } from "lucide-react"; +import Button from "./button"; + +export default function ActionButtons () + { + return( + +
+ + + + + + + + + +
+ ); + } + diff --git a/components/common/infoBanner.tsx b/components/common/infoBanner.tsx index 8450854..04a3b11 100644 --- a/components/common/infoBanner.tsx +++ b/components/common/infoBanner.tsx @@ -10,9 +10,9 @@ export default function InfoBanner({
+ p-2 flex items-center shadow-sm"> -

+

{boldText && {boldText}} {normalText}

diff --git a/components/common/statusBadge.tsx b/components/common/statusBadge.tsx new file mode 100644 index 0000000..ad584ec --- /dev/null +++ b/components/common/statusBadge.tsx @@ -0,0 +1,14 @@ +export const StatusBadge = ({ + text, + color, +}: { + text: string; + color: string; +}) => ( + + + {text} + +); \ No newline at end of file diff --git a/components/dashboard/compliance/auditAndSurvey.tsx b/components/dashboard/compliance/auditAndSurvey.tsx new file mode 100644 index 0000000..c344655 --- /dev/null +++ b/components/dashboard/compliance/auditAndSurvey.tsx @@ -0,0 +1,111 @@ +import { useState } from 'react'; +import { + ClipboardCheck, + Clock, + AlertTriangle, + Activity, + CheckSquare, + Plus +} from "lucide-react"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import InfoBanner from '@/components/common/infoBanner'; +import Table from '@/components/common/dataTable'; +import { auditheaders, auditrows } from '@/constants/tabledata'; + + + + +export default function AuditSurveyPortal() { + return ( +
+ {/* --- HEADER SECTION --- */} +
+
+
+ Apple One — HQ Tower + + COMPLIANCE + + AUDIT & SURVEY +
+

+ Audit & survey management +

+

+ Mobile-based paperless audits and surveys with real-time scoring, findings tracking and a corrective-action workflow. +

+
+ + {/* --- HEADER BUTTONS --- */} +
+ + + +
+
+ + {/* --- STAT CARDS --- */} +
+ {/* Card 1: Audits closed (Emerald/Green Icon) */} + + + {/* Card 2: In progress (Amber/Yellow Icon) */} + + + {/* Card 3: Total findings (Rose/Red Icon) */} + + + {/* Card 4: Avg audit score (Blue Icon) */} + +
+ +
+ + +
+ + + ); +} \ No newline at end of file diff --git a/components/dashboard/compliance/contracts.tsx b/components/dashboard/compliance/contracts.tsx new file mode 100644 index 0000000..aff6de6 --- /dev/null +++ b/components/dashboard/compliance/contracts.tsx @@ -0,0 +1,110 @@ +import { useState } from 'react'; +import { + FileText, + AlertTriangle, + Clock, + Star, + BarChart2, + Plus +} from "lucide-react"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import InfoBanner from "@/components/common/infoBanner"; +import Table from '@/components/common/dataTable'; +import { contractheaders, contractrows } from '@/constants/tabledata'; + + + +export default function ContractsPortal() { + return ( +
+ {/* --- HEADER SECTION --- */} +
+
+
+ Apple One — HQ Tower + + COMPLIANCE + + Contracts +
+

+ Contract management +

+

+ Central vendor-contract repository with SLA tracking, renewal alerts, performance scorecards, e-signature and a full audit trail. +

+
+ + {/* --- HEADER BUTTONS --- */} +
+ + + +
+
+ + {/* --- STAT CARDS --- */} +
+ {/* Card 1: Active vendors */} + + + {/* Card 2: Avg SLA adherence */} + + + {/* Card 3: Open field jobs */} + + + {/* Card 4: Avg response time */} + +
+ +
+ +
+ +
+ + ); +} \ No newline at end of file diff --git a/components/dashboard/compliance/fireAndSafety.tsx b/components/dashboard/compliance/fireAndSafety.tsx new file mode 100644 index 0000000..4e488ff --- /dev/null +++ b/components/dashboard/compliance/fireAndSafety.tsx @@ -0,0 +1,205 @@ +import { useState } from 'react'; +import { + ShieldCheck, + Clock, + AlertTriangle, + Calendar, + Layers, + Plus +} from "lucide-react"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import Table from '@/components/common/dataTable'; +import { firesafetyheaders, firesafetyrows } from '@/constants/tabledata'; +import { StatusBadge } from '@/components/common/statusBadge'; + + + + + +export default function FireSafetyPortal() { + return ( +
+ {/* --- HEADER SECTION --- */} +
+
+
+ Apple One — HQ Tower + + COMPLIANCE + + FIRE & SAFETY +
+

+ Fire & safety management +

+

+ Safety-equipment inspections, drill scheduling, evacuation plans and incident reporting with regulatory compliance tracking. +

+
+ + {/* --- HEADER BUTTONS --- */} +
+ + + +
+
+ + {/* --- STAT CARDS --- */} +
+ {/* Card 1: Equipment compliant */} + + + {/* Card 2: Inspections due */} + + + {/* Card 3: Open incidents */} + + + {/* Card 4: Next drill */} + +
+ + {/* --- MAIN CONTENT LAYOUT --- */} +
+ {/* Left Column: Safety equipment inspection Table */} +
+
+

+ Safety equipment inspection +

+ + 6 asset classes + +
+
+ + + {/* Right Column: Drill schedule & Incidents */} +
+ {/* Drill schedule Card */} +
+

+ Drill schedule +

+ +
+ {/* Timeline Item 1 */} +
+ +

+ Q3 full evacuation drill +

+

+ Jul 12, 2026 reserved +

+
+ + {/* Timeline Item 2 */} +
+ +

+ Wardens refresher +

+

+ Jun 30, 2026 reserved +

+
+ + {/* Timeline Item 3 */} +
+ +

+ Q2 drill · 92% turnout +

+

+ Apr 14, 2026 completed +

+
+
+
+ + {/* Incidents Card */} +
+

+ Incidents +

+ +
+ {/* Incident 1 */} +
+
+

+ Minor smoke · pantry +

+

+ INC-21 Jun 18 +

+
+ +
+ + {/* Incident 2 */} +
+
+

+ Extinguisher low pressure +

+

+ INC-22 Jun 24 +

+
+ +
+
+
+
+ + + ); +} \ No newline at end of file diff --git a/components/dashboard/compliance/statutoryCompliance.tsx b/components/dashboard/compliance/statutoryCompliance.tsx new file mode 100644 index 0000000..8c4ead3 --- /dev/null +++ b/components/dashboard/compliance/statutoryCompliance.tsx @@ -0,0 +1,166 @@ +import { useState } from 'react'; +import { + Layers, + ShieldCheck, + CheckSquare, + Clock, + Search, + QrCode, + Power, + Sparkles, + List, + Pencil, + Plus, +} from 'lucide-react'; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import Table from "@/components/common/dataTable"; +import InfoBanner from '@/components/common/infoBanner'; +import { statutoryheaders, statutoryrows } from '@/constants/tabledata'; + + + + + + + +export default function StatutoryCompliancePortal() { + return ( + /* Increased container padding and max-width auto alignment */ +
+ + {/* --- HEADER SECTION --- */} +
+
+
+ Apple One — HQ Tower + + Compliance + + Statutory +
+

+ Statutory compliance tracker +

+

+ Centralized register of statutory, regulatory, legal, safety and environmental obligations — with expiry tracking, reminders, document vault and audit trail. +

+
+ + {/* --- HEADER BUTTONS --- */} +
+ + + +
+
+ + {/* --- STAT CARDS GRID --- */} +
+ + + + + + + +
+ + {/* --- SEARCH, FILTERS & ACTION BUTTONS --- */} +
+ {/* Search & Select Filters */} +
+ {/* Search Bar */} +
+ + +
+ + {/* Category Dropdown */} + + + {/* Status Dropdown */} + +
+ + {/* Action Buttons */} +
+ + + +
+
+ + {/* --- TABLE CONTAINER --- */} +
+
+ +
+ +
+ + ); +} \ No newline at end of file diff --git a/components/dashboard/compliance/training.tsx b/components/dashboard/compliance/training.tsx new file mode 100644 index 0000000..17871c2 --- /dev/null +++ b/components/dashboard/compliance/training.tsx @@ -0,0 +1,123 @@ +import { useState } from 'react'; +import { + ShieldCheck, + Clock, + AlertTriangle, + Calendar, + Layers, + Plus, + GraduationCap, + Star, + Activity, + LayoutGrid +} from "lucide-react"; +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 { trainingtabs } from '@/constants/constant'; +import InfoBanner from '@/components/common/infoBanner'; +import { trainingheaders, trainingrows } from '@/constants/tabledata'; + + + +export default function TrainingPortal() { + const [activeTab, setActiveTab] = useState('Courses'); + return ( +
+ {/* --- HEADER SECTION --- */} +
+
+
+ Apple One — HQ Tower + + COMPLIANCE + + TRAINING +
+

+ Training & onboarding +

+

+ Onboarding checklists, course management, mandatory compliance training and certification tracking with expiry alerts. +

+
+ + {/* --- HEADER BUTTONS --- */} +
+ + + +
+
+ + + {/* --- STAT CARDS --- */} +
+ {/* Card 1: Active courses */} + + + {/* Card 2: Completion rate */} + + + {/* Card 3: Mandatory pending */} + + + {/* Card 4: Certs expiring */} + +
+ +
+
+ +
+ + + ); +} \ No newline at end of file diff --git a/components/dashboard/compliance/wasteAndEsg.tsx b/components/dashboard/compliance/wasteAndEsg.tsx new file mode 100644 index 0000000..614fc1a --- /dev/null +++ b/components/dashboard/compliance/wasteAndEsg.tsx @@ -0,0 +1,173 @@ +import { useState } from 'react'; +import { + Recycle, + Leaf, + Activity, + Check, + BarChart2, + Plus +} from "lucide-react"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import InfoBanner from '@/components/common/infoBanner'; +import { scheduleItems, wasteStreams } from '@/constants/constant'; + + + +export default function WasteESGPortal() { + return ( +
+ {/* --- HEADER SECTION --- */} +
+
+
+ Apple One — HQ Tower + + SUSTAINABILITY + + WASTE +
+

+ Waste management +

+

+ Waste tracked by stream, recycling rates, collection scheduling and ESG reporting with vendor compliance. +

+
+ + {/* --- HEADER BUTTONS --- */} +
+ + + +
+
+ + {/* --- STAT CARDS --- */} +
+ {/* Card 1: Total waste */} + + + {/* Card 2: Diverted rate */} + + + {/* Card 3: Hazardous waste */} + + + {/* Card 4: Vendors compliant */} + +
+ + {/* --- MAIN CONTENT SECTION BELOW STAT CARDS --- */} +
+ {/* Waste by Stream Progress Chart */} +
+
+

+ Waste by stream · kg +

+ + June 2026 + +
+ +
+ {wasteStreams.map((item, index) => ( +
+ + {item.name} + +
+
+
+ + {item.amount} + +
+ ))} +
+
+ + {/* Collection Schedule Table */} +
+

+ Collection schedule +

+ +
+
+ + + + + + + + + {scheduleItems.map((row, idx) => ( + + + + + + ))} + +
FREQUENCYSTREAMVENDOR
+ {row.frequency} + + {row.stream} + + {row.vendor} +
+
+
+
+ + +
+ ); +} \ No newline at end of file diff --git a/components/dashboard/finance/costInvoice.tsx b/components/dashboard/finance/costInvoice.tsx index b1024e9..24d0e2f 100644 --- a/components/dashboard/finance/costInvoice.tsx +++ b/components/dashboard/finance/costInvoice.tsx @@ -11,193 +11,11 @@ import InfoBanner from "@/components/common/infoBanner"; import Button from "@/components/common/button"; import StatCard from "@/components/common/dashStatCard"; import Table from "@/components/common/dataTable"; +import { costInvoiceheaders, costInvoicerows } from "@/constants/tabledata"; -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 (
@@ -284,7 +102,7 @@ export default function CostInvoicePortal() {
- +
{/* Info Banner */}
diff --git a/components/dashboard/insight/reports.tsx b/components/dashboard/insight/reports.tsx index 062ab80..fd64ed3 100644 --- a/components/dashboard/insight/reports.tsx +++ b/components/dashboard/insight/reports.tsx @@ -5,123 +5,17 @@ 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'; +import { reportheaders, reportrows } from '@/constants/tabledata'; -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 (
@@ -166,7 +60,6 @@ export default function ReportPortal() { />
-
+
diff --git a/components/dashboard/intelligence/aiAndPredictive.tsx b/components/dashboard/intelligence/aiAndPredictive.tsx new file mode 100644 index 0000000..645487f --- /dev/null +++ b/components/dashboard/intelligence/aiAndPredictive.tsx @@ -0,0 +1,210 @@ +import { useState } from 'react'; +import { + Zap, + AlertTriangle, + Activity, + Plus, + Sparkles, + ShieldAlert, + IndianRupee +} from "lucide-react"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import InfoBanner from '@/components/common/infoBanner'; +import {Card} from '@/components/common/cardWrapper'; // Assuming Card wrapper location +import { CardHeader } from '@/components/common/cardHeader'; // Assuming CardHeader location + +export default function AiPredictivePortal() { + return ( +
+ {/* --- HEADER SECTION --- */} +
+
+
+ Apple One — HQ Tower + + INTELLIGENCE + + AI +
+

+ AI & predictive intelligence +

+

+ Real-time asset metrics, fault detection & diagnosis, predictive maintenance alerts and energy-saving intelligence — continuously learning. +

+
+ + {/* --- HEADER BUTTONS --- */} +
+ + + +
+
+ + {/* --- STAT CARDS --- */} +
+ {/* Card 1: Predicted failures */} + + + {/* Card 2: Savings opportunity */} + + + {/* Card 3: Active anomalies */} + + + {/* Card 4: Model confidence */} + +
+ + {/* --- CARDS SECTION BELOW STATCARDS --- */} +
+ {/* Left Card: Predictive maintenance alerts */} + + +
+
+
+ +
+

Chiller-02 compressor

+

Bearing wear — likely failure in ~18 days

+
+
+
+ 91% +

confidence

+
+
+ +
+
+ +
+

AHU-07 drive belt

+

Vibration trend rising — inspect within 10 days

+
+
+
+ 78% +

confidence

+
+
+ +
+
+ +
+

DG-01 fuel system

+

Efficiency drop 6% — filter service due

+
+
+
+ 84% +

confidence

+
+
+ +
+
+ +
+

Lift-03 door motor

+

Cycle-time anomaly — monitor

+
+
+
+ 64% +

confidence

+
+
+
+
+ + {/* Right Card: Energy intelligence */} + + +
+
+
Area
+
Recommendation
+
Saving
+
+ +
+
+
HVAC scheduling
+
Shift pre-cooling to off-peak
+
₹1.8 L/mo
+
+ +
+
Lighting
+
Daylight dimming zones L2–L5
+
₹0.6 L/mo
+
+ +
+
Chiller staging
+
Optimise sequencing logic
+
₹1.1 L/mo
+
+
+
+
+
+ +
+ +
+
+ ); +} \ No newline at end of file diff --git a/components/dashboard/intelligence/assetHealth.tsx b/components/dashboard/intelligence/assetHealth.tsx new file mode 100644 index 0000000..c9bea15 --- /dev/null +++ b/components/dashboard/intelligence/assetHealth.tsx @@ -0,0 +1,108 @@ +import { useState } from 'react'; +import { + Zap, + AlertTriangle, + Activity, + Plus, + Sparkles, + ShieldAlert, + IndianRupee, + Clock, + ShieldCheck +} from "lucide-react"; +import Button from "@/components/common/button"; +import StatCard from "@/components/common/dashStatCard"; +import InfoBanner from '@/components/common/infoBanner'; +import {Card} from '@/components/common/cardWrapper'; // Assuming Card wrapper location +import { CardHeader } from '@/components/common/cardHeader'; // Assuming CardHeader location + +export default function AssetHealthPortal() { + return ( +
+ {/* --- HEADER SECTION --- */} +
+
+
+ Apple One — HQ Tower + + INTELLIGENCE + + ASSET HEALTH +
+

+ Asset health & reliability +

+

+ A live health index per asset from reliability signals — MTBF, MTTR and criticality drive condition-based PM instead of fixed calendars. +

+
+ + {/* --- HEADER BUTTONS --- */} +
+ + + +
+
+ + {/* --- STAT CARDS --- */} +
+ {/* Card 1: Predicted failures */} + + + + + + + +
+ + + +
+ +
+
+ ); +} \ No newline at end of file diff --git a/components/dashboard/operations/energy.tsx b/components/dashboard/operations/energy.tsx index 09d02a0..b7a0e61 100644 --- a/components/dashboard/operations/energy.tsx +++ b/components/dashboard/operations/energy.tsx @@ -1,92 +1,13 @@ -import { - Package, - AlertTriangle, - Activity, - FileText, - LayoutGrid, - Plus -} from "lucide-react"; + import Button from "@/components/common/button"; -import StatCard from "@/components/common/dashStatCard"; + +import Table from "@/components/common/dataTable"; +import { meterHeaders, meterRows, readingHeaders, readingRows } from "@/constants/tabledata"; export default function EnergyPortal() { - const metersList = [ - { - meter: "MTR-1", - name: "Electricity main 1", - location: "Pump room", - type: "Electricity", - mf: "1", - }, - { - meter: "MTR-2", - name: "Water main 2", - location: "Main LT panel", - type: "Water", - mf: "10", - }, - { - meter: "MTR-3", - name: "Diesel main 3", - location: "DG room", - type: "Diesel", - mf: "100", - }, - { - meter: "MTR-4", - name: "Electricity main 4", - location: "Block riser", - type: "Electricity", - mf: "1", - }, - { - meter: "MTR-5", - name: "Water main 5", - location: "DG room", - type: "Water", - mf: "1", - }, - ]; - - const latestReadings = [ - { - meter: "MTR-1", - prev: "40.00", - current: "58.00", - cons: "18.0", - uom: "kWh", - }, - { - meter: "MTR-2", - prev: "49.00", - current: "69.00", - cons: "200.0", - uom: "kL", - }, - { - meter: "MTR-3", - prev: "58.00", - current: "80.00", - cons: "2200.0", - uom: "L", - }, - { - meter: "MTR-4", - prev: "67.00", - current: "91.00", - cons: "24.0", - uom: "kWh", - }, - { - meter: "MTR-5", - prev: "76.00", - current: "102.00", - cons: "26.0", - uom: "kL", - }, - ]; + return (
@@ -126,109 +47,9 @@ export default function EnergyPortal() {
{/* LEFT TABLE: METER MASTER */} -
-
-

Meter master

- 5 meters -
- -
-
- - - - - - - - - - - - {metersList.map((row, index) => { - return ( - - - - - - - - - ); - })} - -
MeterNameLocationTypeMF
- {row.meter} - - {row.name} - - {row.location} - - {row.type} - - {row.mf} - -
- - -
-
-
- - - {/* RIGHT TABLE: LATEST READINGS */} -
-
-

Latest readings

- - tap a meter for history - -
- -
- - - - - - - - - - - - {latestReadings.map((row, index) => ( - - - - - - - - ))} - -
MeterPrevCurrentCons.UOM
- {row.meter} - - {row.prev} - - {row.current} - - {row.cons} - - {row.uom} -
-
-
- + + {/* Right table */} +
diff --git a/components/dashboard/operations/equipment.tsx b/components/dashboard/operations/equipment.tsx index 31ce795..2b12555 100644 --- a/components/dashboard/operations/equipment.tsx +++ b/components/dashboard/operations/equipment.tsx @@ -19,134 +19,14 @@ import NavigationTabs from "@/components/common/tabs"; import { equipmentTabs } from "@/constants/constant"; import { useState } from "react"; import StatCard from "@/components/common/dashStatCard"; +import { equipmentheaders, equipmentrows } from "@/constants/tabledata"; -const headers = [ - "Code", - "Equipment", - "Group", - "Block · Floor", - "Service Provider", - "Criticality", - "PPM Status", - "Actions", -]; -const Badge = ({ - text, - color, -}: { - text: string; - color: string; -}) => ( - - - {text} - -); - -const ActionButtons = () => ( -
- - - - - -
-); export default function EquipmentPortal() { const [activeTab, setActiveTab] = useState("Site-Wise Equipment"); - const rows = [ - [ - APP-1100, - Cooling Tower, - "Electrical", - "Block 1 · 2", - "Blue Star", - "Important", - , - , - ], - [ - APP-1103, - Air Handling Unit, - "Plumbing", - "Tower A · 1", - "Blue Star", - , - , - , - ], - [ - APP-1106, - VRV Outdoor, - "Electrical", - "Tower A · G", - "Voltas", - , - , - , - ], - [ - APP-1109, - VRV Outdoor, - "HVAC", - "Tower A · 1", - "Voltas", - "Normal", - , - , - ], - [ - APP-1112, - Air Handling Unit, - "HVAC", - "Tower A · G", - "In-house", - , - , - , - ], - [ - APP-1115, - Air Handling Unit, - "Electrical", - "Tower A · 2", - "Voltas", - , - , - , - ], - [ - APP-1118, - Chiller, - "Electrical", - "Block 1 · 1", - "In-house", - "Important", - , - , - ], - [ - APP-1121, - Cooling Tower, - "Plumbing", - "Tower A · 1", - "Blue Star", - "Normal", - , - , - ], - ]; + return (
@@ -290,7 +170,7 @@ export default function EquipmentPortal() { {/* Data Table */}
-
+
{/* Info Banner */} diff --git a/components/dashboard/operations/helpDesk.tsx b/components/dashboard/operations/helpDesk.tsx index 9a2fb7d..7e138cd 100644 --- a/components/dashboard/operations/helpDesk.tsx +++ b/components/dashboard/operations/helpDesk.tsx @@ -16,289 +16,13 @@ import StatCard from "@/components/common/dashStatCard"; import Table from "@/components/common/dataTable"; import NavigationTabs from '@/components/common/tabs'; import { helpdeskTtabs } from '@/constants/constant'; +import { helpdeskheaders, helpdeskrows } from '@/constants/tabledata'; -const StatusBadge = ({ - text, - color, -}: { - text: string; - color: string; -}) => ( - - - {text} - -); -const ActionButtons = ({ active }: { active: boolean }) => ( -
- - - - - -
-); - -const headers = [ - "", - "Block", - "Floor", - "Zone", - "Department", - "Location", - "Window", - "TAT", - "Sched.", - "Approval", - "Status", - "Actions", -]; - -const checkbox = ( - -); - -const rows = [ - [ - checkbox, - "Block 2", - "1", - "Z2", - "HVAC", - Parking P1, - 01:56–18:00, - "60m", - "4", - ✓ Yes, - , - , - ], - - [ - checkbox, - "Block 1", - "2", - "Z1", - "Inspection work", - Cafeteria, - 01:56–23:59, - "360m", - "6", - , - , - , - ], - - [ - checkbox, - "Block 2", - "G", - "N", - "Inspection work", - Main lobby, - 08:00–23:59, - "360m", - "4", - ✓ Yes, - , - , - ], - - [ - checkbox, - "Block 1", - "2", - "Z2", - "Electrical", - Reception, - 08:00–18:00, - "360m", - "4", - , - , - , - ], - - [ - checkbox, - "Block 2", - "3", - "Z1", - "Housekeeping", - Cafeteria, - 08:00–18:00, - "20m", - "8", - ✓ Yes, - , - , - ], - - [ - checkbox, - "Block 1", - "3", - "Z1", - "Electrical", - Food court, - 08:00–17:30, - "20m", - "8", - , - , - , - ], - - [ - checkbox, - "Block 2", - "1", - "Z2", - "HVAC", - Parking P1, - 01:56–18:00, - "60m", - "4", - ✓ Yes, - , - , - ], - - [ - checkbox, - "Block 1", - "2", - "Z1", - "Inspection work", - Cafeteria, - 01:56–23:59, - "360m", - "6", - , - , - , - ], - - [ - checkbox, - "Block 2", - "G", - "N", - "Inspection work", - Main lobby, - 08:00–23:59, - "360m", - "4", - ✓ Yes, - , - , - ], - - [ - checkbox, - "Block 1", - "2", - "Z2", - "Electrical", - Reception, - 08:00–18:00, - "360m", - "4", - , - , - , - ], - - [ - checkbox, - "Block 2", - "3", - "Z1", - "Housekeeping", - Cafeteria, - 08:00–18:00, - "20m", - "8", - ✓ Yes, - , - , - ], - - [ - checkbox, - "Block 1", - "3", - "Z1", - "Electrical", - Food court, - 08:00–17:30, - "20m", - "8", - , - , - , - ], -]; export default function HelpDeskPortal() { const [activeTab, setActiveTab] = useState('Location'); @@ -425,7 +149,7 @@ export default function HelpDeskPortal() { {/* --- TABLE CONTAINER --- */}
-
+
); diff --git a/components/dashboard/operations/inventory.tsx b/components/dashboard/operations/inventory.tsx index f8c22a1..c26e3dc 100644 --- a/components/dashboard/operations/inventory.tsx +++ b/components/dashboard/operations/inventory.tsx @@ -9,215 +9,13 @@ import { import Button from "@/components/common/button"; import StatCard from "@/components/common/dashStatCard"; import InfoBanner from "@/components/common/infoBanner"; +import { consumptionLedger, stockItems } from "@/constants/constant"; export default function InventoryPortal() { - const stockItems = [ - { - item: "Cooling tower fan belt", - group: "HVAC", - store: "Block Store", - min: 5, - presentValue: 8, - unit: "Gallon", - status: "COMPLETED", - isHighlighted: false, - }, - { - item: "Air filter 24×24", - group: "HVAC", - store: "Block Store", - min: 5, - presentValue: 2, - unit: "Nos", - status: "OVERDUE", - isHighlighted: true, - }, - { - item: "MCB 32A", - group: "Electrical", - store: "Block Store", - min: 5, - presentValue: 8, - unit: "Nos", - status: "COMPLETED", - isHighlighted: false, - }, - { - item: "Contactor 40A", - group: "Electrical", - store: "Block Store", - min: 2, - presentValue: 2, - unit: "Nos", - status: "OVERDUE", - isHighlighted: false, - }, - { - item: "PVC pipe 1\"", - group: "Plumbing", - store: "Main Store", - min: 3, - presentValue: 0, - unit: "Mtr", - status: "OVERDUE", - isHighlighted: false, - }, - { - item: "Submersible pump seal", - group: "Plumbing", - store: "Main Store", - min: 3, - presentValue: 2, - unit: "Nos", - status: "OVERDUE", - isHighlighted: false, - }, - { - item: "Refrigerant R410a", - group: "HVAC", - store: "Block Store", - min: 5, - presentValue: 0, - unit: "Kg", - status: "OVERDUE", - isHighlighted: false, - }, - ]; - - const consumptionLedger = [ - { - txn: "TXN-5200", - item: "Cooling tower fan belt", - type: "Consume", - qty: "2 Gallon", - jobCard: "026/1009", - date: "Jun 20, 2026", - }, - { - txn: "TXN-5201", - item: "MCB 32A", - type: "Consume", - qty: "1 Nos", - jobCard: "026/1016", - date: "Jun 21, 2026", - }, - { - txn: "TXN-5202", - item: "Air filter 24×24", - type: "Receipt", - qty: "10 Nos", - jobCard: "—", - date: "Jun 22, 2026", - }, - { - txn: "TXN-5203", - item: "Submersible pump seal", - type: "Consume", - qty: "1 Nos", - jobCard: "026/1023", - date: "Jun 23, 2026", - }, - { - txn: "TXN-5204", - item: "Air filter 24×24", - type: "Consume", - qty: "3 Nos", - jobCard: "026/1030", - date: "Jun 24, 2026", - }, - { - txn: "TXN-5205", - item: "PVC pipe 1\"", - type: "Receipt", - qty: "20 Mtr", - jobCard: "—", - date: "Jun 25, 2026", - }, - { - txn: "TXN-5406", - item: "Cooling tower fan belt", - type: "Consume", - qty: "2 Gallon", - jobCard: "026/1009", - date: "Jun 7, 2026", - }, - { - txn: "TXN-5407", - item: "MCB 32A", - type: "Consume", - qty: "1 Nos", - jobCard: "026/1016", - date: "Jun 7, 2026", - }, - { - txn: "TXN-5200", - item: "Cooling tower fan belt", - type: "Consume", - qty: "2 Gallon", - jobCard: "026/1009", - date: "Jun 20, 2026", - }, - { - txn: "TXN-5201", - item: "MCB 32A", - type: "Consume", - qty: "1 Nos", - jobCard: "026/1016", - date: "Jun 21, 2026", - }, - { - txn: "TXN-5202", - item: "Air filter 24×24", - type: "Receipt", - qty: "10 Nos", - jobCard: "—", - date: "Jun 22, 2026", - }, - { - txn: "TXN-5203", - item: "Submersible pump seal", - type: "Consume", - qty: "1 Nos", - jobCard: "026/1023", - date: "Jun 23, 2026", - }, - { - txn: "TXN-5204", - item: "Air filter 24×24", - type: "Consume", - qty: "3 Nos", - jobCard: "026/1030", - date: "Jun 24, 2026", - }, - { - txn: "TXN-5205", - item: "PVC pipe 1\"", - type: "Receipt", - qty: "20 Mtr", - jobCard: "—", - date: "Jun 25, 2026", - }, - { - txn: "TXN-5406", - item: "Cooling tower fan belt", - type: "Consume", - qty: "2 Gallon", - jobCard: "026/1009", - date: "Jun 7, 2026", - }, - { - txn: "TXN-5407", - item: "MCB 32A", - type: "Consume", - qty: "1 Nos", - jobCard: "026/1016", - date: "Jun 7, 2026", - }, - ]; - + return (
{/* --- HEADER SECTION --- */} diff --git a/components/dashboard/operations/request.tsx b/components/dashboard/operations/request.tsx index 4d13498..094ad1c 100644 --- a/components/dashboard/operations/request.tsx +++ b/components/dashboard/operations/request.tsx @@ -6,189 +6,12 @@ import NavigationTabs from '@/components/common/tabs'; import { Reqeusttabs,statusFilters } from '@/constants/constant'; import FilterTabs from '@/components/common/roundedFilters'; import Table from '@/components/common/dataTable'; +import { requestheaders, requestrows } from '@/constants/tabledata'; -const StatusBadge = ({ - text, - color, -}: { - text: string; - color: string; -}) => ( - - - {text} - -); -const headers = [ - "Request No.", - "Department", - "Issue", - "Location", - "Assignee", - "Source", - "Status", -]; -const rows = [ - [ - TFM/AP/2026/1009, - "Electrical", - "Lighting out", - "Block 1 · G", - "ME Local", - Line, - , - ], - [ - TFM/AP/2026/1016, - "HVAC", - "AHU not cooling", - "Lobby · 1", - "Dhananjay T.", - Walk-in, - , - ], - [ - TFM/AP/2026/1023, - "HVAC", - "Thermostat fault", - "Block 1 · 1", - "ME Local", - Mobile app, - , - ], - - [ - TFM/AP/2026/1030, - "HVAC", - "Thermostat fault", - "Block 1 · 1", - "Dhananjay T.", - Mobile app, - , - ], - - [ - TFM/AP/2026/1037, - "Civil", - "Glass break", - "Block 1 · 1", - "Local Helpdesk", - Walk-in, - , - ], - - [ - TFM/AP/2026/1044, - "HVAC", - "Chiller alarm", - "Block 1 · 1", - "Dhananjay T.", - Mobile app, - , - ], - - [ - TFM/AP/2026/1051, - "Plumbing", - "Water leakage", - "Lobby · 1", - "Local Helpdesk", - Walk-in, - , - ], - - [ - TFM/AP/2026/1058, - "Civil", - "Glass break", - "Block 2 · 2", - "Dhananjay T.", - Walk-in, - , - ], - - [ - TFM/AP/2026/1065, - "Civil", - "Ceiling crack", - "Lobby · G", - "ME Local", - Line, - , - ], - - [ - TFM/AP/2026/1072, - "Plumbing", - "Water leakage", - "Block 2 · G", - "TECH Local", - Line, - , - ], - - [ - TFM/AP/2026/1079, - "Electrical", - "DB switch fault", - "Tower A · 1", - "TECH Local", - Mobile app, - , - ], - - [ - TFM/AP/2026/1086, - "HVAC", - "AHU not cooling", - "Lobby · 3", - "TECH Local", - Walk-in, - , - ], -]; export default function ServiceRequestsPortal() { const [activeTab, setActiveTab] = useState('TFM Requests'); @@ -251,7 +74,7 @@ export default function ServiceRequestsPortal() { onChange={setActiveFilter} />
-
+
diff --git a/components/dashboard/operations/vendorService.tsx b/components/dashboard/operations/vendorService.tsx index a5ee5f3..ee2cadf 100644 --- a/components/dashboard/operations/vendorService.tsx +++ b/components/dashboard/operations/vendorService.tsx @@ -10,121 +10,9 @@ import { import Button from "@/components/common/button"; import StatCard from "@/components/common/dashStatCard"; import InfoBanner from "@/components/common/infoBanner"; +import { fieldCrewData, vendorData } from '@/constants/constant'; export default function VendorServicePortal() { - const vendorData = [ - { - name: "Voltas Ltd", - id: "CTR-700", - scope: "HVAC AMC & breakdown", - rating: "4.6", - sla: "95%", - slaColor: "text-emerald-400", - response: "4.0h", - openJobs: "2", - }, - { - name: "Blue Star", - id: "CTR-701", - scope: "Chiller & VRV service", - rating: "4.1", - sla: "88%", - slaColor: "text-amber-400", - response: "1.2h", - openJobs: "2", - }, - { - name: "Sterling FM", - id: "CTR-702", - scope: "Integrated FM / soft services", - rating: "3.4", - sla: "94%", - slaColor: "text-emerald-400", - response: "2.4h", - openJobs: "4", - }, - { - name: "OTIS Elevators", - id: "CTR-704", - scope: "Elevator AMC", - rating: "4.8", - sla: "95%", - slaColor: "text-emerald-400", - response: "2.8h", - openJobs: "—", - }, - { - name: "Sodexo", - id: "CTR-705", - scope: "Soft services & cafeteria", - rating: "4.3", - sla: "90%", - slaColor: "text-amber-400", - response: "2.8h", - openJobs: "1", - }, - { - name: "In-house team", - id: "—", - scope: "Day-to-day maintenance", - rating: "4.0", - sla: "93%", - slaColor: "text-amber-400", - response: "3.2h", - openJobs: "3", - }, - ]; - - const fieldCrewData = [ - { - initials: "RK", - name: "Ravi Kumar", - role: "M&E Technician • Chiller plant", - status: "ON-SITE", - statusType: "onsite", - time: "6.4h today", - }, - { - initials: "SI", - name: "Sana Iqbal", - role: "HVAC Engineer • AHU room L7", - status: "ON-SITE", - statusType: "onsite", - time: "6.1h today", - }, - { - initials: "MD", - name: "Mohan D.", - role: "Electrician • En route", - status: "EN-ROUTE", - statusType: "enroute", - time: "—", - }, - { - initials: "LN", - name: "Lakshmi N.", - role: "Housekeeping Lead • Lobby + L2", - status: "ON-SITE", - statusType: "onsite", - time: "6.7h today", - }, - { - initials: "AP", - name: "Arjun P.", - role: "Plumber • Off-site", - status: "OFF-SITE", - statusType: "offsite", - time: "—", - }, - { - initials: "FR", - name: "Fatima R.", - role: "BMS Operator • Control room", - status: "ON-SITE", - statusType: "onsite", - time: "7.6h today", - }, - ]; return (
diff --git a/components/dashboard/operations/workpermit.tsx b/components/dashboard/operations/workpermit.tsx index 2a2bde7..52c8a4a 100644 --- a/components/dashboard/operations/workpermit.tsx +++ b/components/dashboard/operations/workpermit.tsx @@ -1,7 +1,7 @@ import { useState } from 'react'; import { Plus, ShieldCheck, Clock, Check, AlertTriangle, QrCode, FileText, Eye } from 'lucide-react'; import Button from "@/components/common/button"; -import { workPermitFilters } from '@/constants/constant'; +import { permitsData, workPermitFilters } from '@/constants/constant'; import FilterTabs from '@/components/common/roundedFilters'; import StatCard from '@/components/common/dashStatCard'; import InfoBanner from '@/components/common/infoBanner'; @@ -11,94 +11,9 @@ export default function WorkPermitPortal() { const [activeFilter, setActiveFilter] = useState('All'); // Permit Data matching the UI - const permitsData = [ - { - permit: "PTW-2663", - workingType: "Work at Height", - location: "Atrium void", - contractor: "Blue Star", - validityDate: "Jun 26, 2026", - validityTime: "08:30–17:00", - crew: 2, - status: "ACTIVE", - actionText: "Close out", - isHighlighted: false, - }, - { - permit: "PTW-2664", - workingType: "Electrical Isolation", - location: "STP wet well", - contractor: "Sterling FM", - validityDate: "Jun 26, 2026", - validityTime: "09:00–13:00", - crew: 3, - status: "SUBMITTED", - actionText: "Approve", - isHighlighted: true, // Row with highlight bar - }, - { - permit: "PTW-2665", - workingType: "Confined Space", - location: "DG yard", - contractor: "In-house team", - validityDate: "Jun 26, 2026", - validityTime: "14:00–18:00", - crew: 4, - status: "APPROVED", - actionText: "Activate", - isHighlighted: false, - }, - { - permit: "PTW-2666", - workingType: "Hot Work", - location: "Roof terrace", - contractor: "Voltas Ltd", - validityDate: "Jun 25, 2026", - validityTime: "08:00–12:00", - crew: 5, - status: "EXPIRED", - hasViewIconOnly: true, - isHighlighted: false, - }, - { - permit: "PTW-2667", - workingType: "Work at Height", - location: "LT panel room", - contractor: "Blue Star", - validityDate: "Jun 25, 2026", - validityTime: "10:00–16:00", - crew: 2, - status: "CLOSED", - hasViewIconOnly: true, - isHighlighted: false, - }, - { - permit: "PTW-2668", - workingType: "Electrical Isolation", - location: "Chiller plant", - contractor: "Sterling FM", - validityDate: "Jun 26, 2026", - validityTime: "11:00–15:00", - crew: 3, - status: "REJECTED", - hasViewIconOnly: true, - isHighlighted: false, - }, - { - permit: "PTW-2726", - workingType: "Work at Height", - location: "Atrium void", - contractor: "Blue Star", - validityDate: "Jun 26, 2026", - validityTime: "08:30–17:00", - crew: 2, - status: "DRAFT", - actionText: "Submit", - isHighlighted: false, - }, - ]; + - const renderStatusBadge = (status: string) => { + const renderStatusBadge = (status: string) => { switch (status) { case "ACTIVE": return ( diff --git a/components/dashboard/overview/buildingOwner.tsx b/components/dashboard/overview/buildingOwner.tsx index 6225078..7acf0ed 100644 --- a/components/dashboard/overview/buildingOwner.tsx +++ b/components/dashboard/overview/buildingOwner.tsx @@ -24,7 +24,7 @@ export default function BuildingOwnerPortal() { Building Owner
-

+

Building owner portal

diff --git a/components/dashboard/workplace/visitorManagement.tsx b/components/dashboard/workplace/visitorManagement.tsx index 0f474cb..ecb305f 100644 --- a/components/dashboard/workplace/visitorManagement.tsx +++ b/components/dashboard/workplace/visitorManagement.tsx @@ -13,165 +13,9 @@ import InfoBanner from "@/components/common/infoBanner"; import FilterTabs from '@/components/common/roundedFilters'; import { visitorFilters } from '@/constants/constant'; import Table from '@/components/common/dataTable'; +import { visitorheaders, visitorrows } from '@/constants/tabledata'; export default function VistiorManagementPortal() { - const headers = [ - "Pass", - "Visitor", - "Company", - "Host", - "Purpose", - "Type", - "In", - "Out", - "Status", - "", -]; -const Badge = ({ - text, - color, -}: { - text: string; - color: string; -}) => ( - - - {text} - -); - -const rows = [ - [ - VIS-4145, - Rahul Mehta, - "Voltas Ltd", - "Dhananjay T.", - "Maintenance visit", - Contractor, - "09:12", - "—", - , - , - ], - - [ - VIS-4146, - Anita Desai, - "Siemens", - "ME Local", - "Interview", - Interview, - "—", - "—", - , - , - ], - - [ - VIS-4147, - Karthik R., - "Schindler", - "Site FM Lead", - "Client meeting", - Guest, - "08:05", - "10:40", - , - , - ], - - [ - VIS-4148, - Priya Nair, - "Amazon Logistics", - "Estates Office", - "Material delivery", - Delivery, - "—", - "—", - , - , - ], - - [ - VIS-4149, - Imran Q., - "FreshMenu", - "TECH Local", - "AMC service", - Contractor, - "10:30", - "—", - , - , - ], - [ - VIS-4145, - Rahul Mehta, - "Voltas Ltd", - "Dhananjay T.", - "Maintenance visit", - Contractor, - "09:12", - "—", - , - , - ], - - [ - VIS-4146, - Anita Desai, - "Siemens", - "ME Local", - "Interview", - Interview, - "—", - "—", - , - , - ], - - [ - VIS-4147, - Karthik R., - "Schindler", - "Site FM Lead", - "Client meeting", - Guest, - "08:05", - "10:40", - , - , - ], - - [ - VIS-4148, - Priya Nair, - "Amazon Logistics", - "Estates Office", - "Material delivery", - Delivery, - "—", - "—", - , - , - ], - - [ - VIS-4149, - Imran Q., - "FreshMenu", - "TECH Local", - "AMC service", - Contractor, - "10:30", - "—", - , - , - ], -]; const [activeFilter, setActiveFilter] = useState('All'); return ( @@ -263,7 +107,7 @@ const [activeFilter, setActiveFilter] = useState('All'); onChange={setActiveFilter} /> -

+
VIS-4145, + Rahul Mehta, + "Voltas Ltd", + "Dhananjay T.", + "Maintenance visit", + Contractor, + "09:12", + "—", + , + , + ], + + [ + VIS-4146, + Anita Desai, + "Siemens", + "ME Local", + "Interview", + Interview, + "—", + "—", + , + , + ], + + [ + VIS-4147, + Karthik R., + "Schindler", + "Site FM Lead", + "Client meeting", + Guest, + "08:05", + "10:40", + , + , + ], + + [ + VIS-4148, + Priya Nair, + "Amazon Logistics", + "Estates Office", + "Material delivery", + Delivery, + "—", + "—", + , + , + ], + + [ + VIS-4149, + Imran Q., + "FreshMenu", + "TECH Local", + "AMC service", + Contractor, + "10:30", + "—", + , + , + ], + [ + VIS-4145, + Rahul Mehta, + "Voltas Ltd", + "Dhananjay T.", + "Maintenance visit", + Contractor, + "09:12", + "—", + , + , + ], + + [ + VIS-4146, + Anita Desai, + "Siemens", + "ME Local", + "Interview", + Interview, + "—", + "—", + , + , + ], + + [ + VIS-4147, + Karthik R., + "Schindler", + "Site FM Lead", + "Client meeting", + Guest, + "08:05", + "10:40", + , + , + ], + + [ + VIS-4148, + Priya Nair, + "Amazon Logistics", + "Estates Office", + "Material delivery", + Delivery, + "—", + "—", + , + , + ], + + [ + VIS-4149, + Imran Q., + "FreshMenu", + "TECH Local", + "AMC service", + Contractor, + "10:30", + "—", + , + , + ], +]; + +//Request page in operations + + + +export const requestheaders = [ + "Request No.", + "Department", + "Issue", + "Location", + "Assignee", + "Source", + "Status", +]; +export const requestrows = [ + [ + TFM/AP/2026/1009, + "Electrical", + "Lighting out", + "Block 1 · G", + "ME Local", + Line, + , + ], + + [ + TFM/AP/2026/1016, + "HVAC", + "AHU not cooling", + "Lobby · 1", + "Dhananjay T.", + Walk-in, + , + ], + + [ + TFM/AP/2026/1023, + "HVAC", + "Thermostat fault", + "Block 1 · 1", + "ME Local", + Mobile app, + , + ], + + [ + TFM/AP/2026/1030, + "HVAC", + "Thermostat fault", + "Block 1 · 1", + "Dhananjay T.", + Mobile app, + , + ], + + [ + TFM/AP/2026/1037, + "Civil", + "Glass break", + "Block 1 · 1", + "Local Helpdesk", + Walk-in, + , + ], + + [ + TFM/AP/2026/1044, + "HVAC", + "Chiller alarm", + "Block 1 · 1", + "Dhananjay T.", + Mobile app, + , + ], + + [ + TFM/AP/2026/1051, + "Plumbing", + "Water leakage", + "Lobby · 1", + "Local Helpdesk", + Walk-in, + , + ], + + [ + TFM/AP/2026/1058, + "Civil", + "Glass break", + "Block 2 · 2", + "Dhananjay T.", + Walk-in, + , + ], + + [ + TFM/AP/2026/1065, + "Civil", + "Ceiling crack", + "Lobby · G", + "ME Local", + Line, + , + ], + + [ + TFM/AP/2026/1072, + "Plumbing", + "Water leakage", + "Block 2 · G", + "TECH Local", + Line, + , + ], + + [ + TFM/AP/2026/1079, + "Electrical", + "DB switch fault", + "Tower A · 1", + "TECH Local", + Mobile app, + , + ], + + [ + TFM/AP/2026/1086, + "HVAC", + "AHU not cooling", + "Lobby · 3", + "TECH Local", + Walk-in, + , + ], +]; + + + +//helpdesk in page + +export const helpdeskheaders = [ + "", + "Block", + "Floor", + "Zone", + "Department", + "Location", + "Window", + "TAT", + "Sched.", + "Approval", + "Status", + "Actions", +]; + +const checkbox = ( + +); + +export const helpdeskrows = [ + [ + checkbox, + "Block 2", + "1", + "Z2", + "HVAC", + Parking P1, + 01:56–18:00, + "60m", + "4", + ✓ Yes, + , + , + ], + + [ + checkbox, + "Block 1", + "2", + "Z1", + "Inspection work", + Cafeteria, + 01:56–23:59, + "360m", + "6", + , + , + , + ], + + [ + checkbox, + "Block 2", + "G", + "N", + "Inspection work", + Main lobby, + 08:00–23:59, + "360m", + "4", + ✓ Yes, + , + , + ], + + [ + checkbox, + "Block 1", + "2", + "Z2", + "Electrical", + Reception, + 08:00–18:00, + "360m", + "4", + , + , + , + ], + + [ + checkbox, + "Block 2", + "3", + "Z1", + "Housekeeping", + Cafeteria, + 08:00–18:00, + "20m", + "8", + ✓ Yes, + , + , + ], + + [ + checkbox, + "Block 1", + "3", + "Z1", + "Electrical", + Food court, + 08:00–17:30, + "20m", + "8", + , + , + , + ], + + [ + checkbox, + "Block 2", + "1", + "Z2", + "HVAC", + Parking P1, + 01:56–18:00, + "60m", + "4", + ✓ Yes, + , + , + ], + + [ + checkbox, + "Block 1", + "2", + "Z1", + "Inspection work", + Cafeteria, + 01:56–23:59, + "360m", + "6", + , + , + , + ], + + [ + checkbox, + "Block 2", + "G", + "N", + "Inspection work", + Main lobby, + 08:00–23:59, + "360m", + "4", + ✓ Yes, + , + , + ], + + [ + checkbox, + "Block 1", + "2", + "Z2", + "Electrical", + Reception, + 08:00–18:00, + "360m", + "4", + , + , + , + ], + + [ + checkbox, + "Block 2", + "3", + "Z1", + "Housekeeping", + Cafeteria, + 08:00–18:00, + "20m", + "8", + ✓ Yes, + , + , + ], + + [ + checkbox, + "Block 1", + "3", + "Z1", + "Electrical", + Food court, + 08:00–17:30, + "20m", + "8", + , + , + , + ], +]; + +//Equipment Page in operations +export const equipmentheaders = [ + "Code", + "Equipment", + "Group", + "Block · Floor", + "Service Provider", + "Criticality", + "PPM Status", + "Actions", +]; + + +export const equipmentrows = [ + [ + APP-1100, + Cooling Tower, + "Electrical", + "Block 1 · 2", + "Blue Star", + "Important", + , + , + ], + [ + APP-1103, + Air Handling Unit, + "Plumbing", + "Tower A · 1", + "Blue Star", + , + , + , + ], + [ + APP-1106, + VRV Outdoor, + "Electrical", + "Tower A · G", + "Voltas", + , + , + , + ], + [ + APP-1109, + VRV Outdoor, + "HVAC", + "Tower A · 1", + "Voltas", + "Normal", + , + , + ], + [ + APP-1112, + Air Handling Unit, + "HVAC", + "Tower A · G", + "In-house", + , + , + , + ], + [ + APP-1115, + Air Handling Unit, + "Electrical", + "Tower A · 2", + "Voltas", + , + , + , + ], + [ + APP-1118, + Chiller, + "Electrical", + "Block 1 · 1", + "In-house", + "Important", + , + , + ], + [ + APP-1121, + Cooling Tower, + "Plumbing", + "Tower A · 1", + "Blue Star", + "Normal", + , + , + ], + ]; + + +// Energy page in Operartions +export const meterHeaders = [ + "Meter", + "Name", + "Location", + "Type", + "MF", + "", +]; + +export const meterRows = [ + [ + MTR-1, + Electricity main 1, + "Block riser", + "Electricity", + "10", +
+ + +
, + ], + + [ + MTR-2, + Water main 2, + "Block riser", + "Water", + "100", +
+ + +
, + ], + + [ + MTR-3, + Diesel main 3, + "Block riser", + "Diesel", + "10", +
+ + +
, + ], + + [ + MTR-4, + Electricity main 4, + "Block riser", + "Electricity", + "1", +
+ + +
, + ], + + [ + MTR-5, + Water main 5, + "Block riser", + "Water", + "10", +
+ + +
, + ], +]; + +export const readingHeaders = [ + "Meter", + "Prev", + "Current", + "Cons.", + "UOM", +]; + +export const readingRows = [ + [ + "MTR-1", + "40.00", + "58.00", + 180.0, + kWh, + ], + + [ + "MTR-2", + "49.00", + "69.00", + 2000.0, + kL, + ], + + [ + "MTR-3", + "58.00", + "80.00", + 220.0, + L, + ], + + [ + "MTR-4", + "67.00", + "91.00", + 24.0, + kWh, + ], + + [ + "MTR-5", + "76.00", + "102.00", + 260.0, + kL, + ], +]; +//Report page in Insight +export const reportheaders = [ + "Code", + "Equipment", + "Group", + "Block · Floor", + "Service Provider", + "Manufacturer", + "Model", +]; + +export const reportrows = [ + [ + 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, + ], +]; + + +//Cost Invoice Page +const CostActionButton = ({ text }: { text: string }) => ( + +); + +export const costInvoiceheaders = [ + "Invoice", + "Client", + "Period", + "Amount", + "Raised", + "Due", + "Status", + "", +]; + +export const costInvoicerows = [ + [ + 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, + , + , + ], +]; + + +//Training Page + +export const trainingheaders = [ + "Course", + "Type", + "Completed", + "Progress", + "Renewal", + "Status", + "", +]; + +export const trainingrows = [ + [ + + Fire safety & evacuation + , + + Mandatory + , + "44/48", +
+
+
+
+
, + Annual, + , + , + ], + + [ + + Working at height + , + + Mandatory + , + "12/16", +
+
+
+
+
, + 2 years, + , + , + ], + + [ + + Electrical LOTO + , + + Mandatory + , + "12/12", +
+
+
+
+
, + 2 years, + , + , + ], + + [ + + First aid & CPR + , + + Optional + , + "9/20", +
+
+
+
+
, + 3 years, + , + , + ], + + [ + + New-joiner onboarding + , + + Onboarding + , + "5/6", +
+
+
+
+
, + , + , + , + ], + + [ + + ISO 41001 awareness + , + + Optional + , + "21/30", +
+
+
+
+
, + , + , + , + ], +]; + + + +//Statutory Compliance Page +export const statutoryheaders = [ + "Obligation", + "Category", + "Authority", + "Site", + "Expiry", + "Expires In", + "Docs", + "Status", + "Actions", +]; + +export const statutoryrows = [ + [ + Fire NOC, + Statutory · Fire, + "Fire Dept.", + "HQ Tower", + Oct 1, 2026, + 120 days, + ✓ 1, + , + , + ], + [ + Lift License, + Statutory · Lifts, + "Inspectorate", + "HQ Tower", + Oct 2, 2026, + 24 days, + , + , + , + ], + [ + Pressure Vessel Cert (IBR), + Statutory · Pressure, + "Boiler Board", + "Plant", + Jun 22, 2026, + Expired 8d, + , + , + , + ], + [ + Pollution Consent (CTO), + Environmental, + "Pollution Board", + "Plant", + Oct 4, 2026, + 75 days, + ✓ 1, + , + , + ], + [ + Fire NOC, + Statutory · Fire, + "Fire Dept.", + "HQ Tower", + Oct 1, 2026, + 120 days, + ✓ 1, + , + , + ], + [ + Lift License, + Statutory · Lifts, + "Inspectorate", + "HQ Tower", + Oct 2, 2026, + 24 days, + , + , + , + ], + [ + Pressure Vessel Cert (IBR), + Statutory · Pressure, + "Boiler Board", + "Plant", + Jun 22, 2026, + Expired 8d, + , + , + , + ], + [ + Pollution Consent (CTO), + Environmental, + "Pollution Board", + "Plant", + Oct 4, 2026, + 75 days, + ✓ 1, + , + , + ], +]; + + + +//Fire And Safety Page + +export const firesafetyheaders = [ + "Equipment", + "Location", + "Qty", + "Next Due", + "Status", + "", +]; + +export const firesafetyrows = [ + [ + + Fire extinguishers +
+ (CO2/DCP) +
, + "All floors", + "84", + + Jul 14, +
+ 2026 +
, + , + , + ], + + [ + + Smoke & heat detectors + , + "Plant + floors", + "212", + + Jun 30, +
+ 2026 +
, + , + , + ], + + [ + + Sprinkler system + , + + Basement + +
+ atrium +
, + "1", + + Aug 02, +
+ 2026 +
, + , + , + ], + + [ + + Fire hydrants & hose reels + , + "External + risers", + "18", + + Jun 28, +
+ 2026 +
, + , + , + ], + + [ + + Emergency lighting + , + "Stairwells", + "46", + + Sep 10, +
+ 2026 +
, + , + , + ], + + [ + + Fire alarm panel + , + "BMS room", + "2", + + Jul 01, +
+ 2026 +
, + , + , + ], +]; + + + +// Contracts page +export const contractheaders = [ + "Contract", + "Vendor", + "Scope", + "Value", + "SLA", + "Scorecard", + "Expires", + "", +]; + +export const contractrows = [ + [ + CTR-700, + Voltas Ltd, + "HVAC AMC", + ₹24.0 L, + 98%, + ★★★★★ 4.6, + 120 d, +
+ +
, + ], + + [ + CTR-701, + Blue Star, + "Elevator AMC", + ₹18.0 L, + 91%, + ★★★★☆ 4.1, + 22 d, +
+ + +
, + ], + + [ + CTR-702, + Sterling FM, + "Soft services", + ₹36.0 L, + 86%, + ★★★☆☆ 3.4, + 75 d, +
+ +
, + ], + + [ + CTR-703, + OTIS Elevators, + "DG maintenance", + ₹6.5 L, + 79%, + ★★★☆☆ 2.9, + Expired, +
+ + +
, + ], + + [ + CTR-704, + Sodexo, + "Security services", + ₹42.0 L, + 99%, + ★★★★★ 4.8, + 210 d, +
+ +
, + ], + + [ + CTR-705, + Securitas, + "Pest control", + ₹4.2 L, + 94%, + ★★★★☆ 4.3, + 48 d, +
+ +
, + ], + + [ + CTR-726, + Voltas Ltd, + "HVAC AMC", + ₹24.0 L, + 98%, + ★★★★★ 4.6, + 120 d, +
+ +
, + ], + + [ + CTR-727, + Blue Star, + "Elevator AMC", + ₹18.0 L, + 91%, + ★★★★☆ 4.1, + 22 d, +
+ + +
, + ], + + [ + CTR-728, + Sterling FM, + "Soft services", + ₹36.0 L, + 86%, + ★★★☆☆ 3.4, + 75 d, +
+ +
, + ], +]; + + +// Audit ans Survey page +export const auditheaders = [ + "Ref", + "Audit / Survey", + "Site", + "Score", + "Findings", + "Status", + "", +]; + +export const auditrows = [ + [ + + AUD-301 + , + + Safety walk + , + "HQ Tower", + 92, + "2", + , + , + ], + + [ + + AUD-302 + , + + Housekeeping survey + , + "HQ Tower", + 78, + "5", + , +
+ + +
, + ], + + [ + + AUD-303 + , + + ISO 41001 internal + , + "Annexe", + 88, + "3", + , +
+ + +
, + ], + + [ + + AUD-304 + , + + Energy audit + , + "Plant", + 81, + "4", + , + , + ], + + [ + + AUD-305 + , + + Vendor SLA review + , + "All sites", + 95, + "1", + , + , + ], + + [ + + AUD-325 + , + + Safety walk + , + "HQ Tower", + 92, + "2", + , +
+ + +
, + ], + + [ + + AUD-326 + , + + Housekeeping survey + , + "HQ Tower", + 78, + "5", + , + , + ], + + [ + + AUD-327 + , + + ISO 41001 internal + , + "Annexe", + 88, + "3", + , +
+ + +
, + ], + + [ + + AUD-328 + , + + Energy audit + , + "Plant", + 81, + "4", + , +
+ + +
, + ], +]; \ No newline at end of file