+ {/* Glow Accent Header */}
+
+
+
+
+
-
Pinnacle Portal
+
Pinnacle Executive Portal
- Production Grade JWT Authentication
+ Mandatory Authentication & Single Sign-On
- {/* Quick Demo Profile Selector */}
-
-
-
- {users.map((u) => (
-
- ))}
+ {/* Global Feedback Banner */}
+ {errorMsg && (
+
-
+ )}
-
-
-
+ {successMsg && (
+
+
+ {successMsg}
-
- Or Sign In With Credentials
-
-
+ )}
- {/* Authentication Form */}
-
@@ -476,6 +500,18 @@ export const UsersView: React.FC = ({
+
+
+
+
diff --git a/src/data/defaultData.ts b/src/data/defaultData.ts
index 23dd8ce..88c1168 100644
--- a/src/data/defaultData.ts
+++ b/src/data/defaultData.ts
@@ -461,6 +461,67 @@ export function getDefaultData(): ProjectStore {
triggerEvent: 'SYSTEM_INIT'
}
],
+ timelineEvents: [
+ {
+ id: 1,
+ title: 'Project Kick-off & Charter Sign-off',
+ date: '2026-05-15',
+ time: '10:00',
+ type: 'meeting',
+ category: 'Committee Meeting',
+ description: 'Formal kickoff meeting with PMT and PSC stakeholders to review governance, deliverables, and timeline milestones.',
+ author: 'System Administrator',
+ location: 'Executive Boardroom & Virtual Teams',
+ createdAt: now
+ },
+ {
+ id: 2,
+ title: 'Published Governance Circular PIN-2026-001',
+ date: '2026-05-20',
+ time: '09:00',
+ type: 'circular',
+ category: 'Official Circular',
+ referenceNumber: 'PIN-2026-001',
+ description: 'Official governance baseline circular issued to all business unit leads detailing reporting protocols and escalation thresholds.',
+ author: 'Project Management Office',
+ createdAt: now
+ },
+ {
+ id: 3,
+ title: 'Inception Report Approved & Milestone M1 Reached',
+ date: '2026-06-01',
+ time: '14:30',
+ type: 'milestone',
+ category: 'Project Milestone',
+ description: 'Inception report and quantitative research methodology validated and endorsed by the Steering Committee.',
+ author: 'Sarah Chen',
+ createdAt: now
+ },
+ {
+ id: 4,
+ title: 'Published Survey Instructions Circular PIN-2026-002',
+ date: '2026-06-22',
+ time: '11:00',
+ type: 'circular',
+ category: 'Official Circular',
+ referenceNumber: 'PIN-2026-002',
+ description: 'Guidelines issued for department heads regarding the execution of qualitative and quantitative stakeholder surveys.',
+ author: 'Strategy Advisory Unit',
+ createdAt: now
+ },
+ {
+ id: 5,
+ title: 'Mid-Year Strategic Diagnostic Review',
+ date: '2026-08-05',
+ time: '15:00',
+ type: 'meeting',
+ category: 'Strategic Review',
+ description: 'Executive committee alignment session reviewing market diagnostic findings, PESTEL analysis, and peer benchmarks.',
+ author: 'Elena Rostova',
+ location: 'Virtual Governance Portal',
+ createdAt: now
+ }
+ ],
ids: {
user: 4,
phase: 5,
@@ -470,7 +531,8 @@ export function getDefaultData(): ProjectStore {
risk: 4,
log: 2,
meeting: 3,
- stakeholder: 5
+ stakeholder: 5,
+ timelineEvent: 6
}
};
}
diff --git a/src/types.ts b/src/types.ts
index 723f56a..6c1f8ff 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -9,6 +9,7 @@ export interface User {
email: string;
dept: string;
active: boolean;
+ mustChangePassword?: boolean;
lastLogin?: string | null;
}
@@ -205,6 +206,23 @@ export interface EmailNotificationLog {
triggerEvent: string;
}
+export type TimelineEventType = 'meeting' | 'circular' | 'milestone' | 'decision' | 'release' | 'audit' | 'event' | 'other';
+
+export interface TimelineEvent {
+ id: number;
+ title: string;
+ date: string; // YYYY-MM-DD
+ time?: string; // HH:mm
+ type: TimelineEventType;
+ category?: string;
+ description: string;
+ author?: string;
+ location?: string;
+ referenceNumber?: string; // e.g. Circular PIN-2026-001
+ attachments?: Attachment[];
+ createdAt: string;
+}
+
export interface ProjectStore {
users: User[];
projectStart: string;
@@ -221,6 +239,7 @@ export interface ProjectStore {
stakeholders: Stakeholder[];
decisions: Decision[];
risks: Risk[];
+ timelineEvents?: TimelineEvent[];
logs: ActivityLog[];
smtpConfig?: SmtpConfig;
emailLogs?: EmailNotificationLog[];
@@ -235,6 +254,7 @@ export interface ProjectStore {
log: number;
meeting: number;
stakeholder: number;
+ timelineEvent?: number;
};
}