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 + + +
+ + {/* ASSETS */} +
+ + ASSETS + +
+ {["Manufacturer", "Service Provider", "Criticality"].map((item) => ( + + ))} +
+
+ + {/* OPERATIONS */} +
+ + OPERATIONS + +
+ {["Service Type", "Unit", "Store", "Partners"].map((item) => ( + + ))} +
+
+ + {/* FINANCE */} +
+ + FINANCE + +
+ {["Budget Category", "Budget Type"].map((item) => ( + + ))} +
+
+
+ + {/* Row 2: People */} +
+ + PEOPLE + +
+ +
+
+
+ + {/* --- 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 --- */} +
+ +
+ + {/* --- HIERARCHY CARDS GRID --- */} +
+ {/* Block Column */} +
+
+
+

Block

+ {blocks.length} +
+
+ {blocks.map((item, idx) => ( +
+ {item} +
+ + ACTIVE + + +
+
+ ))} +
+
+ +
+ + {/* Floor Column */} +
+
+
+

Floor

+ {floors.length} +
+
+ {floors.map((item, idx) => ( +
+ {item} +
+ + ACTIVE + + +
+
+ ))} +
+
+ +
+ + {/* Zone Column */} +
+
+
+

Zone

+ {zones.length} +
+
+ {zones.map((item, idx) => ( +
+ {item} +
+ + ACTIVE + + +
+
+ ))} +
+
+ +
+
+ + +
+ ); +} \ 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) => ( + + ))} +
+ + {/* --- MATRIX CONTAINER --- */} +
+ {/* --- LEFT ROLES SIDEBAR --- */} +
+ {rolesList.map((role) => { + const isSelected = selectedRole === role.id; + return ( + + ); + })} +
+ + {/* --- RIGHT PERMISSIONS TABLE --- */} +
+ + + + + + + + + + + + + + + + {permissions.map((row) => ( + + {/* Module Name */} + + + {/* Menu Item Name */} + + + {/* Permission Checkboxes */} + {(["all", "view", "add", "edit", "delete", "cancel", "print"] as const).map( + (permKey) => { + const isChecked = row.permissions[permKey]; + return ( + + ); + } + )} + + ))} + +
MODULEMENUALLVIEWADDEDITDELETECANCELPRINT
+ {row.module} + + {row.menu} + + +
+
+
+ + {/* --- SAVE BUTTON --- */} +
+ +
+
+ ); +} \ 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 */} +
+ +
+
+ + {/* Main Grid Layout */} +
+ {/* Left Column: App Settings */} +
+
+

App settings

+ Apple One +
+ +
+ {/* Default Tenant */} +
+
+

Default tenant

+

Workspace loaded on sign-in

+
+ +
+ + {/* Time Zone */} +
+
+

Time zone

+

+ Used for timestamps & SLA clocks +

+
+ +
+ + {/* Date Format */} +
+
+

Date format

+

+ Display format across the app +

+
+ +
+ + {/* Currency */} +
+
+

Currency

+

Inventory, AMC & cost figures

+
+ +
+ + {/* Language */} +
+
+

Language

+

Interface language

+
+ +
+ + {/* Appearance */} +
+
+

Appearance

+

+ Your personal light / dark preference +

+
+ +
+ + {/* 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 */} +
+ + +
+
+
+
+
+
+ ); +} \ 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 */} +
+ + +
+
+ + {/* 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) */} +
+ + + +
+
+ + {/* User Data Table */} +
+ + + + + + + + + + + + + {userData.map((user, idx) => ( + + + + + + + + + ))} + +
+ Name + + Email + + Mobile + + Latitude + + Longitude + + Site +
+ {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 --- */} +
+ + + +
+
+ + {/* --- 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 + + +
+ + {/* IF Step */} +
+ + IF + + +
+ + {/* THEN Step */} +
+ + THEN + + +
+
+ + {/* Add Step Button */} + +
+
+ + {/* --- 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 + +
+
+
+
+
+

Active

+

12 runs

+
+
+
+ + {/* Rule 2 */} +
+
+
+ +
+
+

+ SLA breach escalation +

+
+ + WHEN SLA timer > 90% + + + + IF Status ≠ Completed + + + + THEN Escalate to L2 + email FM lead + +
+
+
+
+
+

Active

+

5 runs

+
+
+
+ + {/* Rule 3 */} +
+
+
+ +
+
+

+ PPM from health alert +

+
+ + WHEN Asset health < 58 + + + + IF No open PM + + + + THEN Raise condition-based PM work order + +
+
+
+
+
+

Active

+

8 runs

+
+
+
+ + {/* Rule 4 */} +
+
+
+ +
+
+

+ Low-stock reorder +

+
+ + WHEN Stock ≤ minimum + + + + IF Item is consumable + + + + THEN Draft purchase request to store + +
+
+
+
+
+

Paused

+

0 runs

+
+
+
+ + {/* Rule 5 */} +
+
+
+ +
+
+

+ Visitor pre-approval +

+
+ + WHEN Visitor invited + + + + IF Host confirmed + + + + THEN Issue QR pass + notify security + +
+
+
+
+
+

Active

+

23 runs

+
+
+
+
+
+ +
+ +
+ ); +} \ 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 --- */} +
+ + + +
+
+ + {/* 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 */} +
+ Electrical +
+
+
+ 75 +
+ + {/* Plumbing */} +
+ Plumbing +
+
+
+ 86 +
+
+
+ + {/* Card 2: Condition mix */} +
+

Condition mix

+
+ {/* Healthy */} +
+ Healthy +
+
+
+ 4 +
+ + {/* Watch */} +
+ Watch +
+
+
+ 4 +
+ + {/* At risk */} +
+ At risk +
+
+
+ 0 +
+
+
+
+ + + {/* --- 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 --- */} +
+ + + +
+
+ + {/* --- 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 */} +
+ + +
+
+ + {/* --- 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} +

+
+
+ +
+ ))} +
+
+
+ + {/* 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 */} +
+ + +
+
+ + {/* --- 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 */} +
+ HVAC +
+
+
+ 52% +
+ + {/* Item 2 */} +
+ Lighting +
+
+
+ 18% +
+ + {/* Item 3 */} +
+ Plug loads +
+
+
+ 14% +
+ + {/* Item 4 */} +
+ Lifts & pumps +
+
+
+ 11% +
+ + {/* Item 5 */} +
+ Other +
+
+
+ 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 --- */} +
+ + + +
+
+ + {/* --- 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 */} +
+ + + +
+
+ + + + + + + + + + + + {STAFF_DATA.map((staff, idx) => ( + + + + + + + + + ))} + +
NAMEROLEZONEINHRSSTATUS
{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 --- */} +
+ + + +
+
+ + {/* --- 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 --- */} +
+ + + +
+
+ + {/* --- 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

+
+
+
+ + +
+
+ + {/* Alarm Item 2 */} +
+
+ +
+

+ AHU-07 + {" · "} + Filter ΔP beyond limit — replacement due +

+

08:12 · open

+
+
+
+ + +
+
+ + {/* Alarm Item 3 */} +
+
+ +
+

+ CTL-14 + {" · "} + Controller offline — no heartbeat for 30 min +

+

07:56 · open

+
+
+
+ + +
+
+ + {/* Alarm Item 4 */} +
+
+ +
+

+ SNS-208 + {" · "} + CO₂ trending up in open office L3 — 1,080 ppm +

+

07:30 · acknowledged

+
+
+
+ +
+
+ + {/* Alarm Item 5 */} +
+
+ +
+

+ GW-01 + {" · "} + Gateway reconnected after 90 s network drop +

+

06:58 · acknowledged

+
+
+
+ +
+
+
+
+ + {/* --- 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 +

+
+ +
+ + {/* Rule 2 */} +
+
+

+ Escalate unacknowledged criticals +

+

+ Notifies the escalation matrix after 15 minutes +

+
+ +
+ + {/* Rule 3 */} +
+
+

+ Off-hours setpoint relaxation +

+

+ Widens comfort bands 22:00–06:00 to save energy +

+
+ +
+ + {/* Rule 4 */} +
+
+

+ Filter ΔP → PPM task +

+

+ Adds a filter change to the next PPM visit automatically +

+
+ +
+
+
+
+
+ ); +} \ 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 --- */} +
+ + + +
+
+ + {/* --- 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 */} + + +
+
+ BACnet +
+
+
+ 46% +
+ +
+ Modbus +
+
+
+ 31% +
+ +
+ MQTT / LoRa +
+
+
+ 18% +
+ +
+ NB-IoT +
+
+
+ 5% +
+
+
+ +
+ + {/* Right Column (Live Alarm Feed) */} + +
+
+

Live alarm feed

+ +
+

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 --- */} +
+ + + +
+
+ + {/* --- 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 --- */} +
+ + + +
+
+ + {/* --- 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 */} +
+
+ Others + 10% +
+
+
+
+
+ +
+
+ + +
+ + + + + ); +} \ 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 --- */} +
+ + + +
+
+ + {/* --- STAT CARDS (WITH ICON BADGES) --- */} +
+ + {/* Card 1: Chillers running */} + +
+
+ +
+ + staged + +
+
+
2 / 3
+

Chillers running

+
+
+ + {/* Card 2: Avg COP */} + +
+
+ +
+ + plant efficiency + +
+
+
5.60
+

Avg COP

+
+
+ + {/* Card 3: Plant load */} + +
+
+ +
+ + now + +
+
+
401 kW
+

Plant load

+
+
+ + {/* Card 4: AHUs running */} + +
+
+ +
+ + air side + +
+
+
3 / 4
+

AHUs running

+
+
+
+ + {/* --- TELEMETRY SECTION --- */} +
+ + {/* Left Card: Chillers & Plant Load Chart */} + +
+

Chillers

+

live • 5 s refresh

+
+ + {/* Chillers Table */} +
+
+ + + + + + + + + + + + + {/* CH-01 */} + + + + + + + + + + + {/* CH-02 */} + + + + + + + + + + + {/* CH-03 */} + + + + + + + + + + +
UNITSTATUSLOADCOPCHW SUPPLY / RETURNKW
CH-01 + + • RUNNING + + +
+
+
+
+ 72% +
+
5.86.2 °C / 11.8 °C212 + +
CH-02 + + • RUNNING + + +
+
+
+
+ 64% +
+
5.46.5 °C / 12.1 °C189 + +
CH-03 + + • STANDBY + + +
+
+
+
+ 0% +
+
— / —0 + +
+
+ + {/* Plant Load Reusable Bar Chart Component */} +
+

+ PLANT LOAD • TODAY +

+
+ +
+
+ + + {/* Right Card: Air Handling Units */} + +
+
+

Air handling units

+

supply air • fan speed

+
+ + {/* AHUs Table */} +
+ + + + + + + + + + + + + {/* AHU-01 */} + + + + + + + + + + {/* AHU-04 */} + + + + + + + + + + {/* AHU-07 */} + + + + + + + + + + {/* AHU-09 */} + + + + + + + + + +
UNITZONESTATUSSATFANFILTER
AHU-01Lobby & atrium + + • ON + + 14.2 °C62% + + • OK + +
AHU-04Floors 2–4 + + • ON + + 13.8 °C71% + + • OK + +
AHU-07Floors 5–7 + + • ON + + 15.1 °C84% + + • REPLACE + +
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) {
-

Tenant runtime

-
+
{SIDEBAR_ITEMS.map((item) => ( + GW-01 + , + + Gateway + , + BACnet/IP, + + Main LT panel + , + v2.4.1, + 2 s ago, + , +
+ +
, + ], + + [ + + GW-02 + , + + Gateway + , + Modbus TCP, + + Chiller plant room + , + v2.4.1, + 4 s ago, + , +
+ +
, + ], + + [ + + CTL-11 + , + + Controller + , + BACnet MS/TP, + + AHU-07 · Floor 5 + , + v1.9.0, + 1 s ago, + , +
+ +
, + ], + + [ + + CTL-14 + , + + Controller + , + BACnet MS/TP, + + AHU-09 · Basement + , + v1.7.2, + 38 min ago, + , +
+ + +
, + ], + + [ + + SNS-208 + , + + IAQ sensor + , + MQTT · LoRa, + + Open office · L3 + , + v3.1.0, + 12 s ago, + , +
+ +
, + ], + + [ + + SNS-231 + , + + Energy meter + , + Modbus RTU, + + DG room + , + v3.0.4, + 6 s ago, + , +
+ +
, + ], + + [ + + SNS-244 + , + + Water meter + , + MQTT · NB-IoT, + + Pump room + , + v3.1.0, + 20 s ago, + , +
+ +
, + ], +]; + + + +//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, + , + , + ], + + [ + + CASE-F03 + , + + Frozen island · Store 4, Mumbai + , + -19.4°C, + "≤ -18°C", + stable, + , + , + ], + + [ + + CASE-D07 + , + + Dairy case · Store 9, Pune + , + 5.2°C, + "2–4°C", + +0.4°/h, + , + , + ], + + [ + + CHIL-02 + , + + Chiller · Horizon Tower + , + 6.8°C, + "6–8°C", + drifting, + , + , + ], + + [ + + CASE-B01 + , + + Beverage cooler · Store 2, Delhi + , + 3.8°C, + "2–4°C", + stable, + , + , + ], + + [ + + AHU-07 + , + + AHU · Lakeside Campus + , + 12.1°C, + "11–13°C", + stable, + , + , + ], +]; +//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 +
+
, + , +
+
+
+
+ 88 +
, + "162d", + "3.5h", + "On PPM plan", + ], + + [ +
+
Main DB
+
+ APP-1103 • Plumbing +
+
, + , +
+
+
+
+ 93 +
, + "138d", + "6h", + "On PPM plan", + ], + + [ +
+
Cooling Tower
+
+ APP-1106 • Electrical +
+
, + , +
+
+
+
+ 62 +
, + "186d", + "6h", + "Add condition check", + ], + + [ +
+
Chiller
+
+ APP-1109 • Electrical +
+
, + , +
+
+
+
+ 91 +
, + "282d", + "6h", + "On PPM plan", + ], + + [ +
+
Chiller
+
+ APP-1112 • Plumbing +
+
, + , +
+
+
+
+ 82 +
, + "186d", + "5h", + "On PPM plan", + ], + + [ +
+
+ Air Handling Unit +
+
+ APP-1115 • Plumbing +
+
, + , +
+
+
+
+ 79 +
, + "306d", + "6.5h", + "Add condition check", + ], + + [ +
+
Main DB
+
+ APP-1118 • Electrical +
+
, + , +
+
+
+
+ 72 +
, + "138d", + "2h", + "Add condition check", + ], + + [ +
+
Chiller
+
+ APP-1121 • Electrical +
+
, + , +
+
+
+
+ 76 +
, + "138d", + "6h", + "Add condition check", + ], +]; //visitor management page in workplace