diff --git a/app/dashboard/configure/masterdata/page.tsx b/app/dashboard/configure/masterdata/page.tsx
new file mode 100644
index 0000000..8d3b3af
--- /dev/null
+++ b/app/dashboard/configure/masterdata/page.tsx
@@ -0,0 +1,19 @@
+"use client"
+
+import MasterDataPortal from "@/components/dashboard/configure/masterData";
+
+
+
+
+
+export default function MasterdataPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/configure/rolesAndAccess/page.tsx b/app/dashboard/configure/rolesAndAccess/page.tsx
new file mode 100644
index 0000000..0b6569a
--- /dev/null
+++ b/app/dashboard/configure/rolesAndAccess/page.tsx
@@ -0,0 +1,20 @@
+"use client"
+
+import MasterDataPortal from "@/components/dashboard/configure/masterData";
+import RolesAccessPortal from "@/components/dashboard/configure/rolesaccess";
+
+
+
+
+
+export default function RolesAccessPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/configure/settings/page.tsx b/app/dashboard/configure/settings/page.tsx
new file mode 100644
index 0000000..ec22644
--- /dev/null
+++ b/app/dashboard/configure/settings/page.tsx
@@ -0,0 +1,22 @@
+"use client"
+
+import SettingsPortal from "@/components/dashboard/configure/settings";
+
+
+
+
+
+
+
+
+export default function SettingsPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/configure/userLocation/page.tsx b/app/dashboard/configure/userLocation/page.tsx
new file mode 100644
index 0000000..6e966d0
--- /dev/null
+++ b/app/dashboard/configure/userLocation/page.tsx
@@ -0,0 +1,21 @@
+"use client"
+
+import MasterDataPortal from "@/components/dashboard/configure/masterData";
+import RolesAccessPortal from "@/components/dashboard/configure/rolesaccess";
+import UserLocationPortal from "@/components/dashboard/configure/userLocation";
+
+
+
+
+
+export default function userLocationPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/configure/workflowautomation/page.tsx b/app/dashboard/configure/workflowautomation/page.tsx
new file mode 100644
index 0000000..d63bd0a
--- /dev/null
+++ b/app/dashboard/configure/workflowautomation/page.tsx
@@ -0,0 +1,23 @@
+"use client"
+
+
+import WorkFlowAutomationPortal from "@/components/dashboard/configure/workflowAutomation";
+
+
+
+
+
+
+
+
+export default function WorkflowAutomationPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/intelligence/aiHelpdesk/page.tsx b/app/dashboard/intelligence/aiHelpdesk/page.tsx
new file mode 100644
index 0000000..282b9d6
--- /dev/null
+++ b/app/dashboard/intelligence/aiHelpdesk/page.tsx
@@ -0,0 +1,22 @@
+"use client"
+
+
+import AiHelpdeskPortal from "@/components/dashboard/intelligence/aiHelpDesk";
+
+
+
+
+
+
+
+export default function AiHelpdeskPage() {
+ return (
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/intelligence/connectedAsset/page.tsx b/app/dashboard/intelligence/connectedAsset/page.tsx
new file mode 100644
index 0000000..40c42b5
--- /dev/null
+++ b/app/dashboard/intelligence/connectedAsset/page.tsx
@@ -0,0 +1,23 @@
+"use client"
+
+import ConnectedAssetPortal from "@/components/dashboard/intelligence/connectedAssets";
+
+
+
+
+
+
+
+
+
+export default function ConnectedAssetPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/intelligence/connectedOps/page.tsx b/app/dashboard/intelligence/connectedOps/page.tsx
new file mode 100644
index 0000000..c07c8a6
--- /dev/null
+++ b/app/dashboard/intelligence/connectedOps/page.tsx
@@ -0,0 +1,24 @@
+"use client"
+
+import ConnectedOpsPortal from "@/components/dashboard/intelligence/connectedOps";
+
+
+
+
+
+
+
+
+
+
+export default function ConnectedOpsPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/intelligence/energyBenchmarking/page.tsx b/app/dashboard/intelligence/energyBenchmarking/page.tsx
new file mode 100644
index 0000000..ea05176
--- /dev/null
+++ b/app/dashboard/intelligence/energyBenchmarking/page.tsx
@@ -0,0 +1,23 @@
+"use client"
+
+import EnergyBenchmarkingPortal from "@/components/dashboard/intelligence/energybenchmarking";
+
+
+
+
+
+
+
+
+
+export default function EnergybenchmarkingPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/intelligence/gpstracking/page.tsx b/app/dashboard/intelligence/gpstracking/page.tsx
new file mode 100644
index 0000000..34cf54e
--- /dev/null
+++ b/app/dashboard/intelligence/gpstracking/page.tsx
@@ -0,0 +1,25 @@
+"use client"
+
+import ConnectedOpsPortal from "@/components/dashboard/intelligence/connectedOps";
+import GpsTrackingPortal from "@/components/dashboard/intelligence/gpsTracking";
+
+
+
+
+
+
+
+
+
+
+export default function GpsTrackingPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/intelligence/sustainability/page.tsx b/app/dashboard/intelligence/sustainability/page.tsx
new file mode 100644
index 0000000..181b9a5
--- /dev/null
+++ b/app/dashboard/intelligence/sustainability/page.tsx
@@ -0,0 +1,24 @@
+"use client"
+
+import SustainabilityPortal from "@/components/dashboard/intelligence/sustainability";
+
+
+
+
+
+
+
+
+
+
+export default function SustainabilityPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/iot-app/alarmRules/page.tsx b/app/dashboard/iot-app/alarmRules/page.tsx
new file mode 100644
index 0000000..c8525e5
--- /dev/null
+++ b/app/dashboard/iot-app/alarmRules/page.tsx
@@ -0,0 +1,23 @@
+"use client";
+
+
+
+
+import AlarmRulesPortal from "@/components/dashboard/iotapplication/alarmsRules";
+import DeviceFleetPortal from "@/components/dashboard/iotapplication/deviceFleet";
+
+
+
+
+
+export default function AlarmRulesPage() {
+ return (
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/iot-app/commandCenter/page.tsx b/app/dashboard/iot-app/commandCenter/page.tsx
new file mode 100644
index 0000000..66d76a1
--- /dev/null
+++ b/app/dashboard/iot-app/commandCenter/page.tsx
@@ -0,0 +1,19 @@
+"use client";
+
+
+
+import CommandCenterPortal from "@/components/dashboard/iotapplication/commandCenter";
+
+
+
+export default function CommandCenterPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/iot-app/deviceFleet/page.tsx b/app/dashboard/iot-app/deviceFleet/page.tsx
new file mode 100644
index 0000000..20dd18f
--- /dev/null
+++ b/app/dashboard/iot-app/deviceFleet/page.tsx
@@ -0,0 +1,22 @@
+"use client";
+
+
+
+
+import DeviceFleetPortal from "@/components/dashboard/iotapplication/deviceFleet";
+
+
+
+
+
+export default function DeviceFleetPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/iot-app/energyUtility/page.tsx b/app/dashboard/iot-app/energyUtility/page.tsx
new file mode 100644
index 0000000..cc54324
--- /dev/null
+++ b/app/dashboard/iot-app/energyUtility/page.tsx
@@ -0,0 +1,21 @@
+"use client";
+
+
+
+
+import EnergyUtilityPortal from "@/components/dashboard/iotapplication/energyUtility";
+
+
+
+
+export default function EnergyUtilityPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/dashboard/iot-app/hvacPlant/page.tsx b/app/dashboard/iot-app/hvacPlant/page.tsx
new file mode 100644
index 0000000..190c45d
--- /dev/null
+++ b/app/dashboard/iot-app/hvacPlant/page.tsx
@@ -0,0 +1,20 @@
+"use client";
+
+
+
+
+import HVACPlantPortal from "@/components/dashboard/iotapplication/hvacPlant";
+
+
+
+export default function HVACPlantPage() {
+ return (
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/common/infoBanner.tsx b/components/common/infoBanner.tsx
index 04a3b11..abc7e4e 100644
--- a/components/common/infoBanner.tsx
+++ b/components/common/infoBanner.tsx
@@ -12,7 +12,7 @@ export default function InfoBanner({
border-l-[#10b981] bg-[#091624]
p-2 flex items-center shadow-sm">
-
+
{boldText && {boldText} }
{normalText}
diff --git a/components/dashboard/configure/masterData.tsx b/components/dashboard/configure/masterData.tsx
new file mode 100644
index 0000000..c753e20
--- /dev/null
+++ b/components/dashboard/configure/masterData.tsx
@@ -0,0 +1,250 @@
+"use client";
+
+import React, { useState } from "react";
+import { Plus, QrCode, Sparkles } from "lucide-react";
+
+export default function MasterDataPortal() {
+ const [activeTab, setActiveTab] = useState("Block / Floor / Zone");
+
+ // Sample data for the hierarchy cards
+ const blocks = ["Block 1", "Block 2", "Tower A"];
+ const floors = ["Ground", "Floor 1", "Floor 2"];
+ const zones = ["Zone N", "Zone Z1", "Zone Z2"];
+
+ return (
+
+ {/* --- BREADCRUMB --- */}
+
+ APPLE ONE — HQ TOWER
+ •
+ CONFIGURE
+ •
+ MASTER DATA
+
+
+ {/* --- PAGE HEADER --- */}
+
+ Master data
+
+
+ Every transactional module reads from these masters — keep them complete and
+ they cascade across equipment, requests, budgets, training and reports.
+
+
+ {/* --- CATEGORY BUTTONS / TABS --- */}
+
+ {/* Row 1: Site & Location, Assets, Operations, Finance */}
+
+ {/* SITE & LOCATION */}
+
+
+ SITE & LOCATION
+
+ setActiveTab("Block / Floor / Zone")}
+ className={`px-3 py-1.5 rounded-lg border text-xs font-semibold transition-all ${
+ activeTab === "Block / Floor / Zone"
+ ? "bg-[#0b2926] text-emerald-400 border-emerald-500/80 shadow-[0_0_12px_rgba(16,185,129,0.15)]"
+ : "bg-[#0c1622] text-slate-300 border-slate-800 hover:border-slate-700"
+ }`}
+ >
+ Block / Floor / Zone
+
+
+
+ {/* ASSETS */}
+
+
+ ASSETS
+
+
+ {["Manufacturer", "Service Provider", "Criticality"].map((item) => (
+ setActiveTab(item)}
+ className={`px-3 py-1.5 rounded-lg border text-xs transition-all ${
+ activeTab === item
+ ? "bg-[#0b2926] text-emerald-400 border-emerald-500/80"
+ : "bg-[#0c1622] text-slate-300 border-slate-800/80 hover:bg-slate-800/50"
+ }`}
+ >
+ {item}
+
+ ))}
+
+
+
+ {/* OPERATIONS */}
+
+
+ OPERATIONS
+
+
+ {["Service Type", "Unit", "Store", "Partners"].map((item) => (
+ setActiveTab(item)}
+ className={`px-3 py-1.5 rounded-lg border text-xs transition-all ${
+ activeTab === item
+ ? "bg-[#0b2926] text-emerald-400 border-emerald-500/80"
+ : "bg-[#0c1622] text-slate-300 border-slate-800/80 hover:bg-slate-800/50"
+ }`}
+ >
+ {item}
+
+ ))}
+
+
+
+ {/* FINANCE */}
+
+
+ FINANCE
+
+
+ {["Budget Category", "Budget Type"].map((item) => (
+ setActiveTab(item)}
+ className={`px-3 py-1.5 rounded-lg border text-xs transition-all ${
+ activeTab === item
+ ? "bg-[#0b2926] text-emerald-400 border-emerald-500/80"
+ : "bg-[#0c1622] text-slate-300 border-slate-800/80 hover:bg-slate-800/50"
+ }`}
+ >
+ {item}
+
+ ))}
+
+
+
+
+ {/* Row 2: People */}
+
+
+ PEOPLE
+
+
+ setActiveTab("Course")}
+ className={`px-3 py-1.5 rounded-lg border text-xs font-semibold transition-all ${
+ activeTab === "Course"
+ ? "bg-[#0b2926] text-emerald-400 border-emerald-500/80"
+ : "bg-[#0c1622] text-slate-300 border-slate-800/80 hover:bg-slate-800/50"
+ }`}
+ >
+ Course
+
+
+
+
+
+ {/* --- INFO BANNER --- */}
+
+ Within a site: sites themselves are defined in{" "}
+ Administration → Sites (with geofence).
+ Here you manage the Block / Floor / Zone hierarchy inside the active
+ site — reused by Equipment, Desks, Requests and Floor plans.
+
+
+ {/* --- ACTION BUTTON --- */}
+
+
+ Generate QR
+
+
+
+ {/* --- HIERARCHY CARDS GRID --- */}
+
+ {/* Block Column */}
+
+
+
+
Block
+ {blocks.length}
+
+
+ {blocks.map((item, idx) => (
+
+
{item}
+
+
+ ACTIVE
+
+
+ Remove
+
+
+
+ ))}
+
+
+
+
+ Add block
+
+
+
+ {/* Floor Column */}
+
+
+
+
Floor
+ {floors.length}
+
+
+ {floors.map((item, idx) => (
+
+
{item}
+
+
+ ACTIVE
+
+
+ Remove
+
+
+
+ ))}
+
+
+
+
+ Add floor
+
+
+
+ {/* Zone Column */}
+
+
+
+
Zone
+ {zones.length}
+
+
+ {zones.map((item, idx) => (
+
+
{item}
+
+
+ ACTIVE
+
+
+ Remove
+
+
+
+ ))}
+
+
+
+
+ Add zone
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/configure/rolesaccess.tsx b/components/dashboard/configure/rolesaccess.tsx
new file mode 100644
index 0000000..9dc2f57
--- /dev/null
+++ b/components/dashboard/configure/rolesaccess.tsx
@@ -0,0 +1,209 @@
+"use client";
+
+import React, { useState } from "react";
+import { Check } from "lucide-react";
+import Button from "@/components/common/button";
+
+// Initial roles state
+const rolesList = [
+ { id: "admin", label: "Admin", badge: "all" },
+ { id: "helpdesk", label: "Helpdesk", badge: "scoped" },
+ { id: "mne_supervisor", label: "M&E Supervisor", badge: "scoped" },
+ { id: "technician", label: "Technician", badge: "scoped" },
+ { id: "tenant", label: "Tenant", badge: "scoped" },
+];
+
+// Initial permissions table data
+const initialPermissions = [
+ {
+ id: 1,
+ module: "Help Desk",
+ menu: "Daily Location Checklist",
+ permissions: { all: false, view: true, add: true, edit: true, delete: false, cancel: true, print: true },
+ },
+ {
+ id: 2,
+ module: "Equipment",
+ menu: "Site-Wise Equipment",
+ permissions: { all: false, view: true, add: true, edit: true, delete: false, cancel: true, print: true },
+ },
+ {
+ id: 3,
+ module: "Equipment",
+ menu: "AMC Schedule",
+ permissions: { all: false, view: true, add: true, edit: true, delete: false, cancel: true, print: true },
+ },
+ {
+ id: 4,
+ module: "Request",
+ menu: "TFM Request",
+ permissions: { all: false, view: true, add: true, edit: true, delete: false, cancel: true, print: true },
+ },
+ {
+ id: 5,
+ module: "Energy",
+ menu: "Meter Reading",
+ permissions: { all: false, view: true, add: true, edit: true, delete: false, cancel: true, print: true },
+ },
+ {
+ id: 6,
+ module: "Master",
+ menu: "Request Location",
+ permissions: { all: false, view: true, add: true, edit: true, delete: false, cancel: true, print: true },
+ },
+ {
+ id: 7,
+ module: "Security",
+ menu: "Users",
+ permissions: { all: false, view: true, add: true, edit: true, delete: false, cancel: true, print: true },
+ },
+];
+
+export default function RolesAccessPortal() {
+ const [activeTopTab, setActiveTopTab] = useState("Roles & Permissions");
+ const [selectedRole, setSelectedRole] = useState("mne_supervisor");
+ const [permissions, setPermissions] = useState(initialPermissions);
+
+
+ return (
+
+ {/* --- BREADCRUMB --- */}
+
+ APPLE ONE — HQ TOWER
+ •
+ CONFIGURE
+ •
+ ROLES & ACCESS
+
+
+ {/* --- PAGE HEADER --- */}
+
+ Roles & access
+
+
+ Per-tenant role permissions, which platform users can sign in here and with what
+ role, and ticket escalation routing.
+
+
+ {/* --- MAIN TABS --- */}
+
+ {["Roles & Permissions", "Tenant Access", "Escalation Matrix"].map((tab) => (
+ setActiveTopTab(tab)}
+ className={`pb-3 relative transition-colors ${
+ activeTopTab === tab
+ ? "text-emerald-400 font-bold"
+ : "text-slate-400 hover:text-slate-200"
+ }`}
+ >
+ {tab}
+ {activeTopTab === tab && (
+
+ )}
+
+ ))}
+
+
+ {/* --- MATRIX CONTAINER --- */}
+
+ {/* --- LEFT ROLES SIDEBAR --- */}
+
+ {rolesList.map((role) => {
+ const isSelected = selectedRole === role.id;
+ return (
+ setSelectedRole(role.id)}
+ className={`w-full flex items-center justify-between px-5 py-4 text-left transition-all relative ${
+ isSelected
+ ? "bg-[#0c1c2e] text-emerald-400 font-bold"
+ : "text-slate-300 hover:bg-slate-900/40 hover:text-white"
+ }`}
+ >
+ {/* Active side indicator */}
+ {isSelected && (
+
+ )}
+
+ {role.label}
+
+ {role.badge}
+
+
+ );
+ })}
+
+
+ {/* --- RIGHT PERMISSIONS TABLE --- */}
+
+
+
+
+ MODULE
+ MENU
+ ALL
+ VIEW
+ ADD
+ EDIT
+ DELETE
+ CANCEL
+ PRINT
+
+
+
+ {permissions.map((row) => (
+
+ {/* Module Name */}
+
+ {row.module}
+
+
+ {/* Menu Item Name */}
+
+ {row.menu}
+
+
+ {/* Permission Checkboxes */}
+ {(["all", "view", "add", "edit", "delete", "cancel", "print"] as const).map(
+ (permKey) => {
+ const isChecked = row.permissions[permKey];
+ return (
+
+
+ {isChecked && }
+
+
+ );
+ }
+ )}
+
+ ))}
+
+
+
+
+
+ {/* --- SAVE BUTTON --- */}
+
+
+ Save permissions
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/configure/settings.tsx b/components/dashboard/configure/settings.tsx
new file mode 100644
index 0000000..32e8410
--- /dev/null
+++ b/components/dashboard/configure/settings.tsx
@@ -0,0 +1,360 @@
+"use client";
+
+import React, { useState } from "react";
+
+export default function SettingsPortal() {
+ // App Settings State
+ const [appSettings, setAppSettings] = useState({
+ defaultTenant: "Apple One",
+ timeZone: "Asia/Kolkata (IST)",
+ dateFormat: "dd-mm-yyyy",
+ currency: "₹ INR",
+ language: "English",
+ appearance: "Light",
+ });
+
+ // Notifications State
+ const [notifications, setNotifications] = useState({
+ emailAlerts: true,
+ pushNotifications: true,
+ slaBreachAlerts: true,
+ workPermitAlerts: true,
+ dailyDigest: false,
+ });
+
+
+ return (
+
+ {/* Top Header & Breadcrumb */}
+
+
+
+
+ APPLE ONE — HQ TOWER
+ {" "}
+ • CONFIGURE {" "}
+ • SETTINGS
+
+
Settings
+
+ Personal and notification preferences for this tenant workspace.
+
+
+
+ {/* Save Changes Button */}
+
+
+ Save changes
+
+
+
+
+ {/* Main Grid Layout */}
+
+ {/* Left Column: App Settings */}
+
+
+
App settings
+ Apple One
+
+
+
+ {/* Default Tenant */}
+
+
+
Default tenant
+
Workspace loaded on sign-in
+
+
+ Apple One
+
+
+
+ {/* Time Zone */}
+
+
+
Time zone
+
+ Used for timestamps & SLA clocks
+
+
+
+ Asia/Kolkata (IST)
+ UTC
+
+
+
+ {/* Date Format */}
+
+
+
Date format
+
+ Display format across the app
+
+
+
+ dd-mm-yyyy
+ mm-dd-yyyy
+
+
+
+ {/* Currency */}
+
+
+
Currency
+
Inventory, AMC & cost figures
+
+
+ ₹ INR
+ $ USD
+
+
+
+ {/* Language */}
+
+
+
Language
+
Interface language
+
+
+ English
+
+
+
+ {/* Appearance */}
+
+
+
Appearance
+
+ Your personal light / dark preference
+
+
+
+ Light
+ Dark
+
+
+
+ {/* Brand Accent */}
+
+
+
Brand accent
+
+ Set per tenant in Administration → Preferences
+
+
+
+
+ #2DD4BF
+ • inherited
+
+
+
+
+
+ {/* Right Column: Notifications & Personal Settings */}
+
+ {/* Notifications Card */}
+
+
+
Notifications
+
+
+
+ {/* Email Alerts */}
+
+
+
Email alerts
+
+ Request, approval & escalation emails
+
+
+
+
+
+
+
+ {/* Push Notifications */}
+
+
+
Push notifications
+
+ Mobile app push for assignments
+
+
+
+
+
+
+
+ {/* SLA Breach Alerts */}
+
+
+
SLA breach alerts
+
+ Notify when a request goes overdue
+
+
+
+
+
+
+
+ {/* Work-permit Alerts */}
+
+
+
Work-permit alerts
+
+ Notify on permit raise & approval
+
+
+
+
+
+
+
+ {/* Daily Digest */}
+
+
+
Daily digest
+
+ Morning summary of open items
+
+
+
+
+
+
+
+
+
+ {/* Personal Settings Card */}
+
+
+
Personal settings
+
+
+
+
+
+ NAME
+
+
+ Dhananjay T.
+
+
+
+
+
+ ROLE
+
+
+
+ Admin
+
+
+
+ COMPLETED
+
+
+
+
+
+
+ EMAIL
+
+ dhananjay@kafm.io
+
+
+
+
+ MOBILE
+
+ 98•••••012
+
+
+ {/* Action Buttons */}
+
+
+ Edit profile
+
+
+ Change password
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/configure/userLocation.tsx b/components/dashboard/configure/userLocation.tsx
new file mode 100644
index 0000000..95c55b4
--- /dev/null
+++ b/components/dashboard/configure/userLocation.tsx
@@ -0,0 +1,211 @@
+"use client";
+
+import React, { useState } from "react";
+
+// Mock user location data matching the screenshot
+const userData = [
+ {
+ name: "Dhananjay T.",
+ email: "dhananjay@kafm.io",
+ mobile: "7489477369",
+ latitude: "18.5450",
+ longitude: "73.7935",
+ site: "Apple One",
+ // Relative coordinates for the map visual dots (X%, Y%)
+ x: "19%",
+ y: "38%",
+ },
+ {
+ name: "ME Local",
+ email: "me.local@kafm.io",
+ mobile: "9876543210",
+ latitude: "18.5469",
+ longitude: "73.7945",
+ site: "Apple One",
+ x: "44%",
+ y: "43%",
+ },
+ {
+ name: "TECH Local",
+ email: "tech.local@kafm.io",
+ mobile: "9123456780",
+ latitude: "18.5441",
+ longitude: "73.7951",
+ site: "Apple One",
+ x: "69%",
+ y: "48%",
+ },
+];
+
+export default function UserLocationPortal() {
+ const [viewMode, setViewMode] = useState<"map" | "table">("table");
+ const [mapType, setMapType] = useState<"MAP" | "SATELLITE">("MAP");
+
+ return (
+
+ {/* Top Breadcrumb & Header */}
+
+
+ {/* Breadcrumb */}
+
+
+ APPLE ONE — HQ TOWER
+ {" "}
+ • CONFIGURE {" "}
+ • USER LOCATION
+
+
+ {/* Main Title */}
+
User location
+
+ Live position of active technicians, captured from the mobile app. Map
+ and table views.
+
+
+
+ {/* View Switcher Buttons */}
+
+ setViewMode("map")}
+ className={`px-4 py-2 rounded-md text-sm font-medium transition-all ${
+ viewMode === "map"
+ ? "bg-slate-800 text-white shadow-sm"
+ : "text-slate-400 hover:text-slate-200"
+ }`}
+ >
+ Map view
+
+ setViewMode("table")}
+ className={`px-4 py-2 rounded-md text-sm font-medium transition-all ${
+ viewMode === "table"
+ ? "bg-[#2DD4BF] text-[#070D19] font-semibold shadow-sm"
+ : "text-slate-400 hover:text-slate-200"
+ }`}
+ >
+ Table view
+
+
+
+
+ {/* Main Container */}
+
+ {/* Header Bar inside card */}
+
+
+ Active users • Apple One
+
+
+ GPS • live
+
+
+
+ {/* Live Grid Map Visual Area (Height Reduced to h-36) */}
+
+ {/* Dark Grid Background Effect */}
+
+
+ {/* User Map Markers */}
+ {userData.map((user, index) => (
+
+ {/* Pulsing Outer Glow Effect */}
+
+
+ {/* Dot Center */}
+
+
+ {/* Tooltip on Hover */}
+
+
{user.name}
+
+ {user.latitude}, {user.longitude}
+
+
+
+ ))}
+
+ {/* Map Type Toggle (Bottom Right of Map Area) */}
+
+ setMapType("MAP")}
+ className={`hover:text-slate-300 transition-colors ${
+ mapType === "MAP" ? "text-slate-300 font-bold" : ""
+ }`}
+ >
+ MAP
+
+ •
+ setMapType("SATELLITE")}
+ className={`hover:text-slate-300 transition-colors ${
+ mapType === "SATELLITE" ? "text-slate-300 font-bold" : ""
+ }`}
+ >
+ SATELLITE
+
+
+
+
+ {/* User Data Table */}
+
+
+
+
+
+ Name
+
+
+ Email
+
+
+ Mobile
+
+
+ Latitude
+
+
+ Longitude
+
+
+ Site
+
+
+
+
+ {userData.map((user, idx) => (
+
+
+ {user.name}
+
+ {user.email}
+ {user.mobile}
+ {user.latitude}
+ {user.longitude}
+
+ {user.site}
+
+
+ ))}
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/configure/workflowAutomation.tsx b/components/dashboard/configure/workflowAutomation.tsx
new file mode 100644
index 0000000..763cb8e
--- /dev/null
+++ b/components/dashboard/configure/workflowAutomation.tsx
@@ -0,0 +1,326 @@
+import { useState } from 'react';
+import {
+ Bot,
+ Activity,
+ Check,
+ Clock,
+ Plus,
+ Sparkles
+} 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 WorkFlowAutomationPortal() {
+ return (
+
+ {/* --- HEADER SECTION --- */}
+
+
+
+ APPLE ONE — HQ TOWER
+ •
+ CONFIGURE
+ •
+ AUTOMATION
+
+
+ Workflow automation
+
+
+ Build if-this-then-that rules for approvals, dispatch and escalation without code — the same engine competitors gate behind IT change requests.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+ Run log
+
+
+
+
+ New automation
+
+
+
+
+ {/* --- STAT CARDS --- */}
+
+ {/* Card 1: Active automations */}
+
+
+ {/* Card 2: Runs this month */}
+
+
+ {/* Card 3: Tasks auto-handled */}
+
+
+ {/* Card 4: Time saved */}
+
+
+
+ {/* --- RULE BUILDER HEADER SECTION --- */}
+
+
+
+ Rule builder
+
+
+ trigger → condition → action
+
+
+
+
+
+ {/* WHEN Step */}
+
+
+ WHEN
+
+
+ Trigger event
+
+
+
+ {/* IF Step */}
+
+
+ IF
+
+
+ Condition
+
+
+
+ {/* THEN Step */}
+
+
+ THEN
+
+
+ Action
+
+
+
+
+ {/* Add Step Button */}
+
+
+ Add step
+
+
+
+
+ {/* --- AUTOMATION RULE CARDS LIST --- */}
+
+ {/* Rule 1 */}
+
+
+
+
+
+
+
+ Auto-dispatch critical breakdowns
+
+
+
+ WHEN Request raised
+
+ →
+
+ IF Criticality = Critical
+
+ →
+
+ THEN Assign to on-call M&E + notify supervisor
+
+
+
+
+
+
+
+ {/* Rule 2 */}
+
+
+
+
+
+
+
+ SLA breach escalation
+
+
+
+ WHEN SLA timer > 90%
+
+ →
+
+ IF Status ≠ Completed
+
+ →
+
+ THEN Escalate to L2 + email FM lead
+
+
+
+
+
+
+
+ {/* Rule 3 */}
+
+
+
+
+
+
+
+ PPM from health alert
+
+
+
+ WHEN Asset health < 58
+
+ →
+
+ IF No open PM
+
+ →
+
+ THEN Raise condition-based PM work order
+
+
+
+
+
+
+
+ {/* Rule 4 */}
+
+
+
+
+
+
+
+ Low-stock reorder
+
+
+
+ WHEN Stock ≤ minimum
+
+ →
+
+ IF Item is consumable
+
+ →
+
+ THEN Draft purchase request to store
+
+
+
+
+
+
+
+ {/* Rule 5 */}
+
+
+
+
+
+
+
+ Visitor pre-approval
+
+
+
+ WHEN Visitor invited
+
+ →
+
+ IF Host confirmed
+
+ →
+
+ THEN Issue QR pass + notify security
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/intelligence/aiHelpDesk.tsx b/components/dashboard/intelligence/aiHelpDesk.tsx
new file mode 100644
index 0000000..2fed429
--- /dev/null
+++ b/components/dashboard/intelligence/aiHelpDesk.tsx
@@ -0,0 +1,228 @@
+import {
+ Clock,
+ ShieldCheck,
+ Bot,
+ Settings,
+ ReceiptIndianRupee,
+} 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 StatCard from "@/components/common/dashStatCard";
+import { Card } from "@/components/common/cardWrapper";
+import { CardHeader } from "@/components/common/cardHeader";
+import { aiHelpdeskTabs, HANDLES_DATA, LIVE_ACTIVITIES } from "@/constants/constant";
+
+// Sample mock data for Agent Activity
+
+export default function AiHelpdeskPortal() {
+ const [activeTab, setActiveTab] = useState("Desk Booking");
+
+ return (
+
+ {/* --- HEADER SECTION WITH BUTTONS --- */}
+
+
+
+ Apple One — HQ Tower
+ •
+ INTELLIGENCE
+ •
+ AI HELPDESK
+
+
+
+ AI Helpdesk & automation
+
+
+
+ A 24/7 agent that triages service requests, resolves routine issues, verifies vendor invoices against work orders, and enforces SLAs — with every action auditable.
+
+
+
+ {/* --- ACTION BUTTONS --- */}
+
+
+
+ Agent settings
+
+
+
+
+ Ask AI
+
+
+
+
+ {/* Navigation Tabs (Not changed) */}
+
+
+ {/* --- STAT CARDS --- */}
+
+ {/* Auto-resolved */}
+
+
+ {/* Median first response */}
+
+
+ {/* Invoices auto-verified */}
+
+
+ {/* Breaches prevented */}
+
+
+
+ {/* --- AGENT ACTIVITY & DEFLECTION / HANDLES SECTION --- */}
+
+
+ {/* Left Column: Agent activity · live (8 Cols) */}
+
+
+
+
+ {LIVE_ACTIVITIES.map((act, index) => (
+
+
+
+ {act.time}
+
+
+
+ {act.title}
+
+
+ {act.detail}
+
+
+
+
+
+
+
+ {act.status}
+
+
+ {act.conf}
+
+
+
+ ))}
+
+
+
+ {/* Right Column: Deflection & What the agent handles (5 Cols) */}
+
+
+ {/* Top Card: Deflection · last 7 days */}
+
+
+
+
+ {/* Item 1 */}
+
+
Auto-resolved
+
+
68%
+
+
+ {/* Item 2 */}
+
+
Routed to team
+
+
24%
+
+
+ {/* Item 3 */}
+
+
Escalated to human
+
+
8%
+
+
+
+
+ 80% less manual data entry — requests are captured, classified and logged by the agent.
+
+
+
+ {/* Bottom Card: What the agent handles */}
+
+
+
+
+ {HANDLES_DATA.map((item, idx) => (
+
+
+
+ {item.title}
+
+
+ {item.subtitle}
+
+
+
+
+ ACTIVE
+
+
+ ))}
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/intelligence/assetHealth.tsx b/components/dashboard/intelligence/assetHealth.tsx
index c9bea15..fdeb8ea 100644
--- a/components/dashboard/intelligence/assetHealth.tsx
+++ b/components/dashboard/intelligence/assetHealth.tsx
@@ -13,8 +13,10 @@ import {
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 { Card } from '@/components/common/cardWrapper'; // Assuming Card wrapper location
import { CardHeader } from '@/components/common/cardHeader'; // Assuming CardHeader location
+import Table from '@/components/common/dataTable';
+import { assetHealthheaders, assetHealthrows } from '@/constants/tabledata';
export default function AssetHealthPortal() {
return (
@@ -23,13 +25,13 @@ export default function AssetHealthPortal() {
- Apple One — HQ Tower
+ Apple One — HQ Tower
•
INTELLIGENCE
•
ASSET HEALTH
-
+
Asset health & reliability
@@ -54,7 +56,7 @@ export default function AssetHealthPortal() {
{/* --- STAT CARDS --- */}
{/* Card 1: Predicted failures */}
-
-
+ {/* --- MAIN CONTENT GRID (TABLE + RIGHT SIDE CARDS) --- */}
+
+ {/* Left Section: Asset Health Register Table Container */}
+
+
+
+
Asset health register
+ condition-based
+
+
+
+
+ {/* Right Section: Reliability & Condition Mix Side Panel */}
+
+ {/* Card 1: Reliability by group */}
+
+
Reliability by group
+
+ {/* Electrical */}
+
+
+ {/* Plumbing */}
+
+
+
+
+ {/* Card 2: Condition mix */}
+
+
Condition mix
+
+ {/* Healthy */}
+
+
+ {/* Watch */}
+
+
+ {/* At risk */}
+
+
+
+
+
+
+ {/* --- INFO BANNER --- */}
-
diff --git a/components/dashboard/intelligence/connectedAssets.tsx b/components/dashboard/intelligence/connectedAssets.tsx
new file mode 100644
index 0000000..426c438
--- /dev/null
+++ b/components/dashboard/intelligence/connectedAssets.tsx
@@ -0,0 +1,115 @@
+import { useState } from 'react';
+import {
+ Snowflake,
+ AlertTriangle,
+ Zap,
+ Check,
+ FileCheck2,
+ Sparkles
+} 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 InfoBanner from '@/components/common/infoBanner';
+import { connectedassettabs } from '@/constants/constant';
+import { connectedassetheaders, connectedassetrows } from '@/constants/tabledata';
+
+export default function ConnectedAssetPortal() {
+ const [activeTab, setActiveTab] = useState
('Asset Fleet');
+
+ return (
+
+ {/* --- HEADER SECTION --- */}
+
+
+
+ Apple One — HQ Tower
+ •
+ INTELLIGENCE
+ •
+ CONNECTED ASSETS
+
+
+ Connected refrigeration & HVAC
+
+
+ A vertical solution for temperature-critical assets — live setpoint monitoring, excursion response and AI-driven energy optimisation across every store and plant room.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+ HACCP log
+
+
+
+
+ Apply optimisation
+
+
+
+
+ {/* --- STAT CARDS --- */}
+
+ {/* Card 1: Connected assets */}
+
+
+ {/* Card 2: Open excursions */}
+
+
+ {/* Card 3: Energy saved */}
+
+
+ {/* Card 4: Cold-chain uptime */}
+
+
+
+ {/* --- NAVIGATION TABS (UNCHANGED) --- */}
+
+
+ {/* --- TABLE (UNCHANGED) --- */}
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/intelligence/connectedOps.tsx b/components/dashboard/intelligence/connectedOps.tsx
new file mode 100644
index 0000000..e2bd4fb
--- /dev/null
+++ b/components/dashboard/intelligence/connectedOps.tsx
@@ -0,0 +1,265 @@
+"use client";
+import {
+ BarChart2,
+ Globe
+} from "lucide-react";
+
+import { SATISFACTION_DRIVERS, TICKETS_DATA } from "@/constants/constant";
+import Button from "@/components/common/button";
+import InfoBanner from "@/components/common/infoBanner";
+
+// Import your custom Card components
+import { Card } from "@/components/common/cardWrapper";
+import { CardHeader } from "@/components/common/cardHeader";
+import Table from "@/components/common/dataTable";
+import { connectedheaders, connectedrows } from "@/constants/tabledata";
+
+// Custom Stat Card Data matching the UI image exactly
+const STAT_CARDS_DATA = [
+ {
+ title: "SLA ADHERENCE",
+ value: "90%",
+ subtext: "target 90% · automated tracking",
+ progress: 90,
+ color: "bg-[#00c985]", // Vibrant emerald green
+ valueColor: "text-[#00c985]",
+ },
+ {
+ title: "AVG WO RESOLUTION",
+ value: "22.4 h",
+ subtext: "target < 24 h · portfolio median",
+ progress: 93,
+ color: "bg-[#2dd4bf]", // Mint / Teal
+ valueColor: "text-white",
+ },
+ {
+ title: "MANUAL DATA ENTRY",
+ value: "-80%",
+ subtext: "agent-captured requests & readings",
+ progress: 80,
+ color: "bg-[#2dd4bf]", // Mint / Teal
+ valueColor: "text-[#2dd4bf]",
+ },
+ {
+ title: "REPORTING EFFORT",
+ value: "-75%",
+ subtext: "metrics ready for review — no compiling",
+ progress: 75,
+ color: "bg-[#2dd4bf]", // Mint / Teal
+ valueColor: "text-[#2dd4bf]",
+ },
+];
+
+// Data for Risk Radar
+const RISK_RADAR_ITEMS = [
+ {
+ title: "Coastal One · vendor gap",
+ desc: "HVAC vendor completion rate fell to 61% — 8 PPMs at risk of slipping this month. Backup vendor suggested.",
+ tag: "Escalates in ~6 days",
+ tagColor: "text-rose-400",
+ dotColor: "bg-rose-500",
+ action: "Assign backup",
+ },
+ {
+ title: "Lakeside · SLA drift",
+ desc: "P2 response times trending +18% over 3 weeks; correlated with night-shift staffing.",
+ tag: "Breach risk · next week",
+ tagColor: "text-amber-400",
+ dotColor: "bg-amber-400",
+ action: "Adjust roster",
+ },
+ {
+ title: "Monsoon readiness",
+ desc: "4 of 11 waterproofing checks pending across portfolio with rains forecast in 10 days.",
+ tag: "Window closing",
+ tagColor: "text-amber-400",
+ dotColor: "bg-amber-400",
+ action: "Schedule now",
+ },
+ {
+ title: "Spares shortfall",
+ desc: "AHU belt stock below reorder level at 2 sites; next PPM cycle consumes remaining stock.",
+ tag: "3 weeks of stock left",
+ tagColor: "text-sky-400",
+ dotColor: "bg-sky-400",
+ action: "Raise PO",
+ },
+];
+
+// Data for Vendor Performance
+const VENDOR_PERFORMANCE = [
+ { name: "CoolServ HVAC", score: 94, barColor: "bg-emerald-400" },
+ { name: "Apex Elevators", score: 91, barColor: "bg-emerald-400" },
+ { name: "SecureWatch", score: 86, barColor: "bg-emerald-400" },
+ { name: "AquaPure", score: 82, barColor: "bg-amber-400" },
+ { name: "GreenScape", score: 61, barColor: "bg-rose-400" },
+];
+
+// Data for Live Context Feed
+const LIVE_FEED = [
+ { time: "now", text: "Vendor CoolServ acknowledged P1 · Chiller-02 — tenant portal updated" },
+ { time: "4 min", text: "Energy spike at Lakeside auto-linked to AHU-07 alert" },
+ { time: "11 min", text: "Coastal One WO-1221 completed · SLA met · invoice draft created" },
+ { time: "26 min", text: "Tenant satisfaction pulse: 4.4 ★ this week (+0.2)" },
+];
+
+export default function ConnectedOpsPortal() {
+ return (
+
+
+ {/* Page Header Section */}
+
+
+
+ APPLE ONE — HQ TOWER
+ •
+ INTELLIGENCE
+ •
+ CONNECTED OPS
+
+
Connected operations
+
+ Every team, vendor and system on the same live context — portfolio-wide work orders, costs, SLAs and vendor performance in one place, with risks flagged before they escalate.
+
+
+
+ {/* Action Buttons */}
+
+
+
+ Review pack
+
+
+
+ Share live board
+
+
+
+
+ {/* --- STAT CARD GRID (REPLACED WITH UI MATCHING CARDS) --- */}
+
+ {STAT_CARDS_DATA.map((card, idx) => (
+
+
+
+ {card.title}
+
+
+ {card.value}
+
+
+
+
+
+ {card.subtext}
+
+ {/* Progress Bar */}
+
+
+
+ ))}
+
+
+ {/* --- TABLE SECTION --- */}
+
+
+ {/* --- BELOW TABLE SECTION (RISK RADAR, VENDOR PERFORMANCE & LIVE FEED) --- */}
+
+ {/* Left Column: Risk Radar (7 Cols) */}
+
+
+
+
+ {RISK_RADAR_ITEMS.map((item, index) => (
+
+
+
+
+
+ {item.title}
+
+
+ {item.desc}
+
+
+ ⏱ {item.tag}
+
+
+
+
+ {item.action}
+
+
+ ))}
+
+
+
+
+ {/* Right Column: Vendor Performance & Live Context Feed (5 Cols) */}
+
+ {/* Top Right: Vendor Performance */}
+
+
+
+ {VENDOR_PERFORMANCE.map((vendor, idx) => (
+
+
{vendor.name}
+
+
{vendor.score}
+
+ ))}
+
+
+ GreenScape flagged — also holds the disputed invoice in AI Helpdesk.
+
+
+
+ {/* Bottom Right: Live Context Feed */}
+
+
+
+ {LIVE_FEED.map((feed, idx) => (
+
+
+ {feed.time}
+
+
+ {feed.text}
+
+
+ ))}
+
+
+
+
+
+ {/* --- INFO BANNER --- */}
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/intelligence/energybenchmarking.tsx b/components/dashboard/intelligence/energybenchmarking.tsx
new file mode 100644
index 0000000..ee3b5d7
--- /dev/null
+++ b/components/dashboard/intelligence/energybenchmarking.tsx
@@ -0,0 +1,203 @@
+"use client";
+import {
+ Zap,
+ Leaf,
+ AlertTriangle,
+ Database,
+ Sliders,
+ Download,
+ Sparkles
+} from "lucide-react";
+
+import { SATISFACTION_DRIVERS, TICKETS_DATA } from "@/constants/constant";
+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 "@/components/common/cardWrapper";
+import { CardHeader } from "@/components/common/cardHeader";
+
+export default function EnergyBenchmarkingPortal() {
+ return (
+
+
+
+
+ {/* Page Header Section */}
+
+
+
+ APPLE ONE — HQ TOWER
+ •
+ INTELLIGENCE
+ •
+ BENCHMARKING
+
+
Portfolio energy benchmarking
+
+ Rank every site against a common baseline (EUI, kWh/m²/yr), spotlight the best performer, and quantify the savings if the rest caught up.
+
+
+
+ {/* Action Buttons */}
+
+
+
+ Set baseline
+
+
+
+ Export
+
+
+
+
+ {/* --- STAT CARD GRID --- */}
+
+
+
+
+
+
+
+
+
+
+ {/* --- TWO COLUMNS (SITE BENCHMARK & END-USE BREAKDOWN) --- */}
+
+
+ {/* Left Column: Site Benchmark */}
+
+
+
+
+
+ {/* Annexe Bar */}
+
+
+
+ Annexe
+ BEST
+
+
+ 124
+ -17%
+
+
+
+
+
+ {/* HQ Tower Bar */}
+
+
+
HQ Tower
+
+ 163
+ +9%
+
+
+
+
+
+
+
+
+ {/* Right Column: End-use Breakdown */}
+
+
+
+
+
+
+ {/* Item 1 */}
+
+
+ {/* Item 2 */}
+
+
+ {/* Item 3 */}
+
+
+ {/* Item 4 */}
+
+
Lifts & pumps
+
+
11%
+
+
+ {/* Item 5 */}
+
+
+
+
+
+ HVAC dominates intensity — the fastest lever for closing the gap to Annexe .
+
+
+
+
+
+
+
+
+ {/* Footer / Ask AI Floating Banner */}
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/intelligence/gpsTracking.tsx b/components/dashboard/intelligence/gpsTracking.tsx
new file mode 100644
index 0000000..2e271aa
--- /dev/null
+++ b/components/dashboard/intelligence/gpsTracking.tsx
@@ -0,0 +1,220 @@
+import { useState } from 'react';
+import {
+ ShieldCheck,
+ MapPin,
+ Check,
+ Clock,
+ BarChart2,
+ Map
+} from "lucide-react";
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+import NavigationTabs from '@/components/common/tabs';
+
+// Card Components
+import { Card } from "@/components/common/cardWrapper";
+import { CardHeader } from "@/components/common/cardHeader";
+
+import InfoBanner from '@/components/common/infoBanner';
+import { gpsTrackingtabs } from '@/constants/constant';
+
+// Staff Table Data
+const STAFF_DATA = [
+ { name: "Ravi Kumar", role: "M&E Technician", zone: "Chiller plant", inTime: "08:02", hrs: "6.4", status: "ON-SITE", statusType: "success" },
+ { name: "Sana Iqbal", role: "HVAC Engineer", zone: "AHU room L7", inTime: "08:15", hrs: "6.1", status: "ON-SITE", statusType: "success" },
+ { name: "Mohan D.", role: "Electrician", zone: "En route", inTime: "—", hrs: "0", status: "EN-ROUTE", statusType: "warning" },
+ { name: "Lakshmi N.", role: "Housekeeping Lead", zone: "Lobby + L2", inTime: "07:48", hrs: "6.7", status: "ON-SITE", statusType: "success" },
+ { name: "Arjun P.", role: "Plumber", zone: "Off-site", inTime: "—", hrs: "0", status: "OFF-SITE", statusType: "neutral" },
+ { name: "Fatima R.", role: "BMS Operator", zone: "Control room", inTime: "06:55", hrs: "7.6", status: "ON-SITE", statusType: "success" },
+];
+
+export default function GpsTrackingPortal() {
+ const [activeTab, setActiveTab] = useState('Live tracking');
+
+ return (
+
+ {/* --- HEADER SECTION --- */}
+
+
+
+ Apple One — HQ Tower
+ •
+ INTELLIGENCE
+ •
+ GPS TRACKING
+
+
+ GPS staff tracking & geo-fencing
+
+
+ Live geo-tagged locations, geo-fence attendance validation, route history and site entry / exit logs — battery-optimised with cell-tower fallback and mobile-app capture.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+ Geo-fences
+
+
+
+
+ Export
+
+
+
+
+ {/* --- STAT CARDS --- */}
+
+
+
+
+
+
+
+
+
+
+ {/* --- NAVIGATION TABS --- */}
+
+
+ {/* --- MAP & STAFF STATUS SECTION BELOW TABS --- */}
+
+ {/* Left: Live Staff Map */}
+
+
+
+
+ {/* Map Canvas Visual */}
+
+ {/* Grid Background Lines */}
+
+
+ {/* Geo-Fence Boundary Box */}
+
+
+ GEO-FENCE · SITE BOUNDARY
+
+
+ {/* On-Site Staff Dots */}
+
+
+
+
+
+
+ {/* En-Route Staff Dot (Outside Fence) */}
+
+
+
+
+
+ {/* Right: Staff Status Table */}
+
+
+
+
+
+
+
+
+ NAME
+ ROLE
+ ZONE
+ IN
+ HRS
+ STATUS
+
+
+
+ {STAFF_DATA.map((staff, idx) => (
+
+ {staff.name}
+ {staff.role}
+ {staff.zone}
+ {staff.inTime}
+ {staff.hrs}
+
+
+
+ {staff.status}
+
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/intelligence/sustainability.tsx b/components/dashboard/intelligence/sustainability.tsx
new file mode 100644
index 0000000..d02694d
--- /dev/null
+++ b/components/dashboard/intelligence/sustainability.tsx
@@ -0,0 +1,291 @@
+import { useState } from 'react';
+import {
+ Leaf,
+ Activity,
+ ClipboardCheck,
+ Star,
+ BarChart2,
+ Plus,
+ ShieldCheck,
+ Clock
+} from "lucide-react";
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+import NavigationTabs from '@/components/common/tabs';
+
+// Card Components
+import { Card } from "@/components/common/cardWrapper";
+import { CardHeader } from "@/components/common/cardHeader";
+
+// Custom BarChart Import
+import BarChart from "@/components/charts/barchart";
+
+import InfoBanner from '@/components/common/infoBanner';
+import { sustainabilitytabs } from '@/constants/constant';
+
+// Sample Bar Chart Data for Carbon Emissions
+const CARBON_EMISSIONS_DATA = [
+ { month: 'Jan', height: 'h-32' },
+ { month: 'Feb', height: 'h-32' },
+ { month: 'Mar', height: 'h-32' },
+ { month: 'Apr', height: 'h-32' },
+ { month: 'May', height: 'h-32' },
+ { month: 'Jun', height: 'h-28' },
+];
+
+// Emission Sources Progress Data
+const EMISSION_SOURCES = [
+ { name: "Purchased electricity", percentage: "58%", width: "w-[58%]", color: "bg-sky-400" },
+ { name: "DG / fuel combustion", percentage: "21%", width: "w-[21%]", color: "bg-amber-400" },
+ { name: "Refrigerants (fugitive)", percentage: "12%", width: "w-[12%]", color: "bg-rose-400" },
+ { name: "Water & waste", percentage: "9%", width: "w-[9%]", color: "bg-slate-400" },
+];
+
+export default function SustainabilityPortal() {
+ const [activeTab, setActiveTab] = useState('ESG Data Hub');
+
+ return (
+
+ {/* --- HEADER SECTION --- */}
+
+
+
+ Apple One — HQ Tower
+ •
+ INTELLIGENCE
+ •
+ SUSTAINABILITY
+
+
+ ESG One — sustainability platform
+
+
+ Every environmental, social and governance metric — carbon, energy, water, waste, safety, DEI, compliance — consolidated on one live platform with framework-ready reporting.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+ Framework reports
+
+
+
+
+ New target
+
+
+
+
+ {/* --- STAT CARDS --- */}
+
+ {/* Card 1: 118 t */}
+
+
+ {/* Card 2: 214 */}
+
+
+ {/* Card 3: 5 */}
+
+
+ {/* Card 4: B+ */}
+
+
+
+ {/* --- NAVIGATION TABS --- */}
+
+
+ {/* --- ESG CARDS SECTION BELOW TABS --- */}
+
+ {/* Environmental Card */}
+
+
+
+
+
Energy
+
+ 1.42 GWh
+ -4.2%
+
+
+
+
Water
+
+ 18,400 kL
+ -2.8%
+
+
+
+
Waste diverted
+
+ 61%
+ +5.0%
+
+
+
+
Refrigerant leaks
+
+ 2 events
+ +1
+
+
+
+
+
+ {/* Social Card */}
+
+
+
+
+
Safety · LTIFR
+
+ 0.42
+ -0.11
+
+
+
+
Training hours
+
+ 1,240
+ +180
+
+
+
+
Tenant satisfaction
+
+ 4.4 / 5
+ +0.2
+
+
+
+
Workforce diversity
+
+ 34%
+ +2%
+
+
+
+
+
+ {/* Governance Card */}
+
+
+
+
+
Statutory compliance
+
+ 98%
+ 2 open
+
+
+
+
Audit findings closed
+
+ 91%
+ on time
+
+
+
+
Vendor code-of-conduct
+
+ 87%
+ signed
+
+
+
+
Data-privacy incidents
+
+ 0
+ 90 days
+
+
+
+
+
+
+ {/* --- CARBON EMISSIONS BAR CHART & EMISSION SOURCES SECTION --- */}
+
+ {/* Left: Carbon Emissions BarChart */}
+
+
+ {/* Right: Emission Sources */}
+
+
+
+
+ {EMISSION_SOURCES.map((source, idx) => (
+
+
{source.name}
+
+
{source.percentage}
+
+ ))}
+
+
+ Every figure traces back to a meter, sensor or signed record — audit-ready by construction.
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/iotapplication/alarmsRules.tsx b/components/dashboard/iotapplication/alarmsRules.tsx
new file mode 100644
index 0000000..cabc81f
--- /dev/null
+++ b/components/dashboard/iotapplication/alarmsRules.tsx
@@ -0,0 +1,334 @@
+import { useState } from 'react';
+import {
+ BarChart2,
+ Check,
+ AlertTriangle,
+ Clock,
+ CheckCircle2,
+ Cpu
+} from "lucide-react";
+import Button from "@/components/common/button";
+import StatCard from "@/components/common/dashStatCard";
+
+export default function AlarmRulesPortal() {
+ // State for automation rules toggles
+ const [autoWorkOrder, setAutoWorkOrder] = useState(true);
+ const [escalateCriticals, setEscalateCriticals] = useState(true);
+ const [offHoursSetpoint, setOffHoursSetpoint] = useState(true);
+ const [filterPpmTask, setFilterPpmTask] = useState(false);
+
+ return (
+
+ {/* --- HEADER SECTION --- */}
+
+
+
+ APPLE ONE — HQ TOWER
+ •
+ IOT
+ •
+ ALARMS & RULES
+
+
+ Alarms & automation rules
+
+
+ Acknowledge live alarms, raise work orders in one click, and manage the automation rules that act on telemetry.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+ History
+
+
+
+
+ Acknowledge all (3)
+
+
+
+
+ {/* --- STAT CARDS --- */}
+
+ {/* Card 1: Critical open */}
+
+
+ {/* Card 2: Warnings open */}
+
+
+ {/* Card 3: Acknowledged */}
+
+
+ {/* Card 4: Rules active */}
+
+
+
+ {/* --- MAIN CONTENT GRID --- */}
+
+ {/* --- LEFT SECTION: ALARMS LIST --- */}
+
+
+
Alarms
+
live · newest first
+
+
+
+ {/* Alarm Item 1 */}
+
+
+
+
+
+ CH-02
+ {" · "}
+ Condenser approach high — 4.2 K above design
+
+
08:41 · open
+
+
+
+
+ Ack
+
+
+ Work order
+
+
+
+
+ {/* Alarm Item 2 */}
+
+
+
+
+
+ AHU-07
+ {" · "}
+ Filter ΔP beyond limit — replacement due
+
+
08:12 · open
+
+
+
+
+ Ack
+
+
+ Work order
+
+
+
+
+ {/* Alarm Item 3 */}
+
+
+
+
+
+ CTL-14
+ {" · "}
+ Controller offline — no heartbeat for 30 min
+
+
07:56 · open
+
+
+
+
+ Ack
+
+
+ Work order
+
+
+
+
+ {/* Alarm Item 4 */}
+
+
+
+
+
+ SNS-208
+ {" · "}
+ CO₂ trending up in open office L3 — 1,080 ppm
+
+
07:30 · acknowledged
+
+
+
+
+ Work order
+
+
+
+
+ {/* Alarm Item 5 */}
+
+
+
+
+
+ GW-01
+ {" · "}
+ Gateway reconnected after 90 s network drop
+
+
06:58 · acknowledged
+
+
+
+
+ Work order
+
+
+
+
+
+
+ {/* --- RIGHT SECTION: AUTOMATION RULES --- */}
+
+
+
Automation rules
+
telemetry → action
+
+
+
+ {/* Rule 1 */}
+
+
+
+ Auto work order on critical alarm
+
+
+ Raises a Help Desk request with the asset and fault pre-filled
+
+
+
setAutoWorkOrder(!autoWorkOrder)}
+ className={`relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none ${
+ autoWorkOrder ? 'bg-[#2dd4bf]' : 'bg-slate-700'
+ }`}
+ >
+
+
+
+
+ {/* Rule 2 */}
+
+
+
+ Escalate unacknowledged criticals
+
+
+ Notifies the escalation matrix after 15 minutes
+
+
+
setEscalateCriticals(!escalateCriticals)}
+ className={`relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none ${
+ escalateCriticals ? 'bg-[#2dd4bf]' : 'bg-slate-700'
+ }`}
+ >
+
+
+
+
+ {/* Rule 3 */}
+
+
+
+ Off-hours setpoint relaxation
+
+
+ Widens comfort bands 22:00–06:00 to save energy
+
+
+
setOffHoursSetpoint(!offHoursSetpoint)}
+ className={`relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none ${
+ offHoursSetpoint ? 'bg-[#2dd4bf]' : 'bg-slate-700'
+ }`}
+ >
+
+
+
+
+ {/* Rule 4 */}
+
+
+
+ Filter ΔP → PPM task
+
+
+ Adds a filter change to the next PPM visit automatically
+
+
+
setFilterPpmTask(!filterPpmTask)}
+ className={`relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none ${
+ filterPpmTask ? 'bg-[#2dd4bf]' : 'bg-slate-800'
+ }`}
+ >
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/iotapplication/commandCenter.tsx b/components/dashboard/iotapplication/commandCenter.tsx
new file mode 100644
index 0000000..8fd8d75
--- /dev/null
+++ b/components/dashboard/iotapplication/commandCenter.tsx
@@ -0,0 +1,258 @@
+import React from 'react';
+import { BarChart2, AlertTriangle, Sparkles } from "lucide-react";
+import Button from "@/components/common/button";
+import { Card } from '@/components/common/cardWrapper';
+import { CardHeader } from '@/components/common/cardHeader';
+
+
+
+// --- MAIN COMMAND CENTER PORTAL ---
+export default function CommandCenterPortal() {
+ return (
+
+
+ {/* --- HEADER SECTION --- */}
+
+
+
+ APPLE ONE — HQ TOWER
+ •
+ IOT
+ •
+ COMMAND CENTER
+
+
+ IoT command center
+
+
+ Every gateway, controller and sensor across the portfolio on one live board — scoped to Apple One.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+ Snapshot
+
+
+
+
+ 3 open alarms
+
+
+
+
+ {/* --- STAT CARDS (WITH PROGRESS LINES) --- */}
+
+ {/* Card 1: SITES ONLINE */}
+
+
+
+ SITES ONLINE
+
+
2 / 2
+
all streaming
+
+
+
+
+ {/* Card 2: DEVICES */}
+
+
+
+ DEVICES
+
+
93
+
5 gateways
+
+
+
+
+ {/* Card 3: LIVE LOAD */}
+
+
+
+ LIVE LOAD
+
+
0.46 MW
+
portfolio now
+
+
+
+
+ {/* Card 4: OPEN ALARMS */}
+
+
+
+ OPEN ALARMS
+
+
3
+
needs attention
+
+
+
+
+
+ {/* --- LOWER SECTION --- */}
+
+
+ {/* Left Column (2 Cards) */}
+
+
+ {/* Site Cards Container */}
+
+ {/* Site 1 */}
+
+
+
+
+
Apple One — HQ Tower
+
+
2 GW
+
+
+ 38 devices
+ 200 kW
+
+ • 2
+
+
+
+
+ {/* Site 2 */}
+
+
+
+
+
Apple One — Annexe
+
+
3 GW
+
+
+ 55 devices
+ 263 kW
+
+ • 1
+
+
+
+
+
+ {/* Protocol Mix Card */}
+
+
+
+
+
+
+
+ {/* Right Column (Live Alarm Feed) */}
+
+
+
+
Live alarm feed
+
+ All alarms
+
+
+
streaming
+
+
+
+
+
+
+
+ CH-02 • Condenser approach high — 4.2 K above design
+
+
08:41 • open
+
+
+
+
+
+
+
+
+
+ AHU-07 • Filter ΔP beyond limit — replacement due
+
+
08:12 • open
+
+
+
+
+
+
+
+
+
+ CTL-14 • Controller offline — no heartbeat for 30 min
+
+
07:56 • open
+
+
+
+
+
+
+
+
+
+ SNS-208 • CO₂ trending up in open office L3 — 1,080 ppm
+
+
07:30 • acknowledged
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/iotapplication/deviceFleet.tsx b/components/dashboard/iotapplication/deviceFleet.tsx
new file mode 100644
index 0000000..f23815d
--- /dev/null
+++ b/components/dashboard/iotapplication/deviceFleet.tsx
@@ -0,0 +1,108 @@
+import { useState } from 'react';
+import {
+ Grid2X2,
+ AlertTriangle,
+ Sun,
+ Disc,
+ Smartphone,
+ FileText
+} 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, devicefleetheaders, devicefleetrows } from '@/constants/tabledata';
+
+export default function DeviceFleetPortal() {
+ return (
+
+ {/* --- HEADER SECTION --- */}
+
+
+
+ APPLE ONE — HQ TOWER
+ •
+ IOT
+ •
+ DEVICE FLEET
+
+
+ Gateways, controllers & sensors
+
+
+ The connected-device registry for Apple One — protocol, firmware and heartbeat for every device.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+ Pair device
+
+
+
+
+ Update firmware (1)
+
+
+
+
+ {/* --- STAT CARDS --- */}
+
+ {/* Card 1: Online */}
+
+
+ {/* Card 2: Offline */}
+
+
+ {/* Card 3: Firmware pending */}
+
+
+ {/* Card 4: Protocols */}
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/iotapplication/energyUtility.tsx b/components/dashboard/iotapplication/energyUtility.tsx
new file mode 100644
index 0000000..540b872
--- /dev/null
+++ b/components/dashboard/iotapplication/energyUtility.tsx
@@ -0,0 +1,198 @@
+import React from 'react';
+import { BarChart2, Zap } from "lucide-react";
+import Button from "@/components/common/button";
+import { Card } from '@/components/common/cardWrapper';
+import Table from '@/components/common/dataTable';
+import { energyUtilityHeaders, energyUtilityRows } from '@/constants/tabledata';
+import InfoBanner from '@/components/common/infoBanner';
+
+export default function EnergyUtilityPortal() {
+ return (
+
+
+ {/* --- HEADER SECTION --- */}
+
+
+
+ APPLE ONE — HQ TOWER
+ •
+ IOT
+ •
+ ENERGY & UTILITIES
+
+
+ Energy & utilities telemetry
+
+
+ Live smart-meter streams for power, water and gas — the same spine that feeds the Energy module and ESG reporting.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+ Export readings
+
+
+
+
+ Open Energy module
+
+
+
+
+ {/* --- STAT CARDS (WITH PROGRESS LINES) --- */}
+
+
+ {/* Card 1: LIVE BUILDING LOAD */}
+
+
+
+ LIVE BUILDING LOAD
+
+
386 kW
+
peak today 512 kW
+
+
+
+
+ {/* Card 2: ENERGY TODAY (Active highlighted border) */}
+
+
+
+ ENERGY TODAY
+
+
3,120 kWh
+
-4% vs yesterday
+
+
+
+
+ {/* Card 3: WATER TODAY */}
+
+
+
+ WATER TODAY
+
+
38.4 kL
+
municipal + borewell
+
+
+
+
+ {/* Card 4: METERS ONLINE */}
+
+
+
+ METERS ONLINE
+
+
4 / 6
+
1 gas meter offline
+
+
+
+
+
+
+ {/* --- TELEMETRY & BREAKDOWN SECTION --- */}
+
+
+ {/* Left Side: Smart Meters Table */}
+
+
+
+
Smart meters
+
auto-polled
+
+
+
+
+
+
+ {/* Right Side: Load by end use — live */}
+
+
+
+
Load by end use — live
+
% of 386 kW
+
+
+ {/* Load Breakdown Bars */}
+
+
+ {/* HVAC Plant */}
+
+
+ HVAC plant
+ 44%
+
+
+
+
+ {/* Lighting & small power */}
+
+
+ Lighting & small power
+ 23%
+
+
+
+
+ {/* Lifts & pumps */}
+
+
+ Lifts & pumps
+ 12%
+
+
+
+
+ {/* Data / UPS */}
+
+
+ Data / UPS
+ 11%
+
+
+
+
+ {/* Others */}
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/iotapplication/hvacPlant.tsx b/components/dashboard/iotapplication/hvacPlant.tsx
new file mode 100644
index 0000000..8b87057
--- /dev/null
+++ b/components/dashboard/iotapplication/hvacPlant.tsx
@@ -0,0 +1,355 @@
+import React from 'react';
+import { BarChart2, Zap, Snowflake, Activity, Target } from "lucide-react";
+import Button from "@/components/common/button";
+import { Card } from '@/components/common/cardWrapper';
+
+import BarChart from "@/components/charts/barchart"; // Replace path with your actual BarChart component import path
+
+const plantLoadData = [
+ { month: '08', height: 'h-[35%]' },
+ { month: '09', height: 'h-[38%]' },
+ { month: '10', height: 'h-[32%]' },
+ { month: '11', height: 'h-[40%]' },
+ { month: '12', height: 'h-[52%]' },
+ { month: '13', height: 'h-[68%]' },
+ { month: '14', height: 'h-[78%]' },
+ { month: '15', height: 'h-[78%]' },
+ { month: '16', height: 'h-[78%]' },
+ { month: '17', height: 'h-[78%]' },
+ { month: '18', height: 'h-[78%]' },
+ { month: '19', height: 'h-[78%]' }
+];
+
+export default function HVACPlantPortal() {
+ return (
+
+
+ {/* --- HEADER SECTION --- */}
+
+
+
+ APPLE ONE — HQ TOWER
+ •
+ IOT
+ •
+ HVAC PLANT
+
+
+ Chiller plant & air side
+
+
+ Live chiller, AHU and plant telemetry with start/stop control — commands are audit-logged.
+
+
+
+ {/* --- HEADER BUTTONS --- */}
+
+
+
+ Plant report
+
+
+
+
+ Optimise staging
+
+
+
+
+ {/* --- STAT CARDS (WITH ICON BADGES) --- */}
+
+
+ {/* Card 1: Chillers running */}
+
+
+
+
2 / 3
+
Chillers running
+
+
+
+ {/* Card 2: Avg COP */}
+
+
+
+
+ plant efficiency
+
+
+
+
+
+ {/* Card 3: Plant load */}
+
+
+
+
+
+ {/* Card 4: AHUs running */}
+
+
+
+
+
+
+ {/* --- TELEMETRY SECTION --- */}
+
+
+ {/* Left Card: Chillers & Plant Load Chart */}
+
+
+
Chillers
+
live • 5 s refresh
+
+
+ {/* Chillers Table */}
+
+
+
+
+ UNIT
+ STATUS
+ LOAD
+ COP
+ CHW SUPPLY / RETURN
+ KW
+
+
+
+
+ {/* CH-01 */}
+
+ CH-01
+
+
+ • RUNNING
+
+
+
+
+
+ 5.8
+ 6.2 °C / 11.8 °C
+ 212
+
+
+ Stop
+
+
+
+
+ {/* CH-02 */}
+
+ CH-02
+
+
+ • RUNNING
+
+
+
+
+
+ 5.4
+ 6.5 °C / 12.1 °C
+ 189
+
+
+ Stop
+
+
+
+
+ {/* CH-03 */}
+
+ CH-03
+
+
+ • STANDBY
+
+
+
+
+
+ —
+ — / —
+ 0
+
+
+ Start
+
+
+
+
+
+
+
+ {/* Plant Load Reusable Bar Chart Component */}
+
+
+ PLANT LOAD • TODAY
+
+
+
+
+
+
+
+ {/* Right Card: Air Handling Units */}
+
+
+
+
Air handling units
+
supply air • fan speed
+
+
+ {/* AHUs Table */}
+
+
+
+
+ UNIT
+ ZONE
+ STATUS
+ SAT
+ FAN
+ FILTER
+
+
+
+ {/* AHU-01 */}
+
+ AHU-01
+ Lobby & atrium
+
+
+ • ON
+
+
+ 14.2 °C
+ 62%
+
+
+ • OK
+
+
+
+
+ {/* AHU-04 */}
+
+ AHU-04
+ Floors 2–4
+
+
+ • ON
+
+
+ 13.8 °C
+ 71%
+
+
+ • OK
+
+
+
+
+ {/* AHU-07 */}
+
+ AHU-07
+ Floors 5–7
+
+
+ • ON
+
+
+ 15.1 °C
+ 84%
+
+
+ • REPLACE
+
+
+
+
+ {/* AHU-09 */}
+
+ AHU-09
+
+ Basement · parking
+
+
+
+ • OFF
+
+
+ —
+ 0%
+
+
+ • OK
+
+
+
+
+
+
+
+
+ {/* Footer Warning Notice */}
+
+ AHU-07 filter ΔP is beyond limit — a PPM task can be raised automatically from{' '}
+ Alarms & Rules .
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/layouts/sideBarItem.tsx b/components/layouts/sideBarItem.tsx
index 96c09ab..fc6dd96 100644
--- a/components/layouts/sideBarItem.tsx
+++ b/components/layouts/sideBarItem.tsx
@@ -14,12 +14,12 @@ export default function SidebarItem({ item }: Props) {
setOpen(!open)}
className="flex w-full items-center justify-between
- px-3 py-4 hover:bg-slate-900"
+ px-2 py-3 hover:bg-slate-900"
>
- {item.title}
+ {item.title}
{open && item.children.length > 0 && (
-
+
{item.children.map((child: any) => (
diff --git a/components/layouts/sidebar.tsx b/components/layouts/sidebar.tsx
index 5589933..9ad551b 100644
--- a/components/layouts/sidebar.tsx
+++ b/components/layouts/sidebar.tsx
@@ -38,11 +38,11 @@ console.log("Session data ",session?.user?.email)
-
Tenant runtime
-
+
{SIDEBAR_ITEMS.map((item) => (
+ GW-01
+ ,
+
+ Gateway
+ ,
+ BACnet/IP ,
+
+ Main LT panel
+ ,
+ v2.4.1 ,
+ 2 s ago ,
+ ,
+
+
+ Ping
+
+
,
+ ],
+
+ [
+
+ GW-02
+ ,
+
+ Gateway
+ ,
+ Modbus TCP ,
+
+ Chiller plant room
+ ,
+ v2.4.1 ,
+ 4 s ago ,
+ ,
+
+
+ Ping
+
+
,
+ ],
+
+ [
+
+ CTL-11
+ ,
+
+ Controller
+ ,
+ BACnet MS/TP ,
+
+ AHU-07 · Floor 5
+ ,
+ v1.9.0 ,
+ 1 s ago ,
+ ,
+
+
+ Ping
+
+
,
+ ],
+
+ [
+
+ CTL-14
+ ,
+
+ Controller
+ ,
+ BACnet MS/TP ,
+
+ AHU-09 · Basement
+ ,
+ v1.7.2 ,
+ 38 min ago ,
+ ,
+
+
+ Ping
+
+
+ Restart
+
+
,
+ ],
+
+ [
+
+ SNS-208
+ ,
+
+ IAQ sensor
+ ,
+ MQTT · LoRa ,
+
+ Open office · L3
+ ,
+ v3.1.0 ,
+ 12 s ago ,
+ ,
+
+
+ Ping
+
+
,
+ ],
+
+ [
+
+ SNS-231
+ ,
+
+ Energy meter
+ ,
+ Modbus RTU ,
+
+ DG room
+ ,
+ v3.0.4 ,
+ 6 s ago ,
+ ,
+
+
+ Ping
+
+
,
+ ],
+
+ [
+
+ SNS-244
+ ,
+
+ Water meter
+ ,
+ MQTT · NB-IoT ,
+
+ Pump room
+ ,
+ v3.1.0 ,
+ 20 s ago ,
+ ,
+
+
+ Ping
+
+
,
+ ],
+];
+
+
+
+//Energy Utility in IOT app
+export const energyUtilityHeaders = [
+ "METER",
+ "UTILITY",
+ "READING",
+ "LIVE",
+ "STATUS",
+ "LAST SYNC",
+];
+
+export const energyUtilityRows = [
+ [
+
+ MTR-EB-01
+ ,
+
+ Grid mains · EB
+ Main LT panel
+
,
+ 4,82,110 kWh ,
+ 312 kW ,
+ ,
+ 4 s ago ,
+ ],
+
+ [
+
+ MTR-DG-01
+ ,
+
+ DG set · 500 kVA
+ DG yard
+
,
+ 18,240 kWh ,
+ 0 kW ,
+ ,
+ 8 s ago ,
+ ],
+
+ [
+
+ MTR-SOL-01
+ ,
+
+ Solar rooftop
+ Terrace inverter room
+
,
+ 96,480 kWh ,
+ 74 kW ,
+ ,
+ 3 s ago ,
+ ],
+
+ [
+
+ MTR-WTR-01
+ ,
+
+ Water · municipal
+ Pump room inlet
+
,
+ 12,940 kL ,
+ 2.1 kL/h ,
+ ,
+ 11 s ago ,
+ ],
+
+ [
+
+ MTR-WTR-02
+ ,
+
+ Water · borewell
+ Pump room inlet
+
,
+ 3,410 kL ,
+ 0.6 kL/h ,
+ ,
+ 9 s ago ,
+ ],
+
+ [
+
+ MTR-GAS-01
+ ,
+
+ LPG · kitchen bank
+ Gas bank, B1
+
,
+ 1,880 kg ,
+ — ,
+ ,
+ 26 min ago ,
+ ],
+];
+
+
+//connected asset in intelligence
+export const connectedassetheaders = [
+ "Asset",
+ "Location",
+ "Now",
+ "Setpoint",
+ "Trend",
+ "Status",
+ "",
+];
+
+export const connectedassetrows = [
+ [
+
+ CASE-D12
+ ,
+
+ Dairy case · Store 4, Mumbai
+ ,
+ 3.1°C ,
+ "2–4°C",
+ stable ,
+ ,
+
+ Telemetry
+ ,
+ ],
+
+ [
+
+ CASE-F03
+ ,
+
+ Frozen island · Store 4, Mumbai
+ ,
+ -19.4°C ,
+ "≤ -18°C",
+ stable ,
+ ,
+
+ Telemetry
+ ,
+ ],
+
+ [
+
+ CASE-D07
+ ,
+
+ Dairy case · Store 9, Pune
+ ,
+ 5.2°C ,
+ "2–4°C",
+ +0.4°/h ,
+ ,
+
+ Telemetry
+ ,
+ ],
+
+ [
+
+ CHIL-02
+ ,
+
+ Chiller · Horizon Tower
+ ,
+ 6.8°C ,
+ "6–8°C",
+ drifting ,
+ ,
+
+ Telemetry
+ ,
+ ],
+
+ [
+
+ CASE-B01
+ ,
+
+ Beverage cooler · Store 2, Delhi
+ ,
+ 3.8°C ,
+ "2–4°C",
+ stable ,
+ ,
+
+ Telemetry
+ ,
+ ],
+
+ [
+
+ AHU-07
+ ,
+
+ AHU · Lakeside Campus
+ ,
+ 12.1°C ,
+ "11–13°C",
+ stable ,
+ ,
+
+ Telemetry
+ ,
+ ],
+];
+//Connected Ops in intelligence
+export const connectedheaders = [
+ "Site",
+ "Open WOs",
+ "SLA",
+ "Cost MTD",
+ "Vendor Score",
+ "Status",
+];
+
+export const connectedrows = [
+ [
+
+ Horizon Tower · Mumbai
+ ,
+ "34",
+ 96% ,
+ "₹8.4 L",
+ "4.6 / 5",
+ ,
+ ],
+
+ [
+
+ Lakeside Campus · Pune
+ ,
+ "51",
+ 88% ,
+ "₹12.1 L",
+ "4.1 / 5",
+ ,
+ ],
+
+ [
+
+ Metro Business Park · Delhi
+ ,
+ "28",
+ 93% ,
+ "₹6.7 L",
+ "4.4 / 5",
+ ,
+ ],
+
+ [
+
+ Coastal One · Chennai
+ ,
+ "63",
+ 74% ,
+ "₹15.8 L",
+ "3.2 / 5",
+ ,
+ ],
+];
+
+
+
+
+// Asset Health page in intelligence
+
+
+
+export const assetHealthheaders = [
+ "Asset",
+ "Criticality",
+ "Health",
+ "MTBF",
+ "MTTR",
+ "Recommendation",
+];
+
+export const assetHealthrows = [
+ [
+
+
Main DB
+
+ APP-1100 • Plumbing
+
+
,
+ ,
+ ,
+ "162d",
+ "3.5h",
+ "On PPM plan",
+ ],
+
+ [
+
+
Main DB
+
+ APP-1103 • Plumbing
+
+
,
+ ,
+ ,
+ "138d",
+ "6h",
+ "On PPM plan",
+ ],
+
+ [
+
+
Cooling Tower
+
+ APP-1106 • Electrical
+
+
,
+ ,
+ ,
+ "186d",
+ "6h",
+ "Add condition check",
+ ],
+
+ [
+
+
Chiller
+
+ APP-1109 • Electrical
+
+
,
+ ,
+ ,
+ "282d",
+ "6h",
+ "On PPM plan",
+ ],
+
+ [
+
+
Chiller
+
+ APP-1112 • Plumbing
+
+
,
+ ,
+ ,
+ "186d",
+ "5h",
+ "On PPM plan",
+ ],
+
+ [
+
+
+ Air Handling Unit
+
+
+ APP-1115 • Plumbing
+
+
,
+ ,
+ ,
+ "306d",
+ "6.5h",
+ "Add condition check",
+ ],
+
+ [
+
+
Main DB
+
+ APP-1118 • Electrical
+
+
,
+ ,
+ ,
+ "138d",
+ "2h",
+ "Add condition check",
+ ],
+
+ [
+
+
Chiller
+
+ APP-1121 • Electrical
+
+
,
+ ,
+ ,
+ "138d",
+ "6h",
+ "Add condition check",
+ ],
+];
//visitor management page in workplace