125 lines
8.3 KiB
JavaScript
125 lines
8.3 KiB
JavaScript
/**
|
|
* Simple observable implementation for state changes
|
|
*/
|
|
class SimpleObservable {
|
|
listeners = new Set();
|
|
subscribe(listener) {
|
|
this.listeners.add(listener);
|
|
return () => this.listeners.delete(listener);
|
|
}
|
|
next(value) {
|
|
for (const listener of this.listeners) {
|
|
listener(value);
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Centralized state management for the admin dashboard.
|
|
* Handles cross-view data passing and state synchronization.
|
|
*/
|
|
export class AdminState {
|
|
// Observable subjects for reactive updates
|
|
monitors$ = new SimpleObservable();
|
|
incidents$ = new SimpleObservable();
|
|
config$ = new SimpleObservable();
|
|
// Current data
|
|
_monitors = [];
|
|
_incidents = [];
|
|
_config = null;
|
|
// Selected items for navigation context
|
|
_selectedMonitor = null;
|
|
_selectedIncident = null;
|
|
// Monitors
|
|
get monitors() {
|
|
return this._monitors;
|
|
}
|
|
set monitors(value) {
|
|
this._monitors = value;
|
|
this.monitors$.next(value);
|
|
}
|
|
// Incidents
|
|
get incidents() {
|
|
return this._incidents;
|
|
}
|
|
set incidents(value) {
|
|
this._incidents = value;
|
|
this.incidents$.next(value);
|
|
}
|
|
// Config
|
|
get config() {
|
|
return this._config;
|
|
}
|
|
set config(value) {
|
|
this._config = value;
|
|
if (value) {
|
|
this.config$.next(value);
|
|
}
|
|
}
|
|
// Selected monitor for edit navigation
|
|
setSelectedMonitor(monitor) {
|
|
this._selectedMonitor = monitor;
|
|
}
|
|
getSelectedMonitor() {
|
|
return this._selectedMonitor;
|
|
}
|
|
clearSelectedMonitor() {
|
|
this._selectedMonitor = null;
|
|
}
|
|
// Selected incident for edit navigation
|
|
setSelectedIncident(incident) {
|
|
this._selectedIncident = incident;
|
|
}
|
|
getSelectedIncident() {
|
|
return this._selectedIncident;
|
|
}
|
|
clearSelectedIncident() {
|
|
this._selectedIncident = null;
|
|
}
|
|
// Helper methods
|
|
getCategories() {
|
|
const categories = new Set();
|
|
for (const monitor of this._monitors) {
|
|
if (monitor.category) {
|
|
categories.add(monitor.category);
|
|
}
|
|
}
|
|
return Array.from(categories).sort();
|
|
}
|
|
getAvailableServices() {
|
|
return [...this._monitors];
|
|
}
|
|
getMonitorById(id) {
|
|
return this._monitors.find(m => m.id === id);
|
|
}
|
|
getIncidentById(id) {
|
|
return this._incidents.find(i => i.id === id);
|
|
}
|
|
getActiveIncidents() {
|
|
return this._incidents.filter(i => !['resolved', 'postmortem'].includes(i.status));
|
|
}
|
|
getPastIncidents() {
|
|
return this._incidents.filter(i => ['resolved', 'postmortem'].includes(i.status));
|
|
}
|
|
// CRUD operations (these would typically call an API)
|
|
addMonitor(monitor) {
|
|
this.monitors = [...this._monitors, monitor];
|
|
}
|
|
updateMonitor(id, data) {
|
|
this.monitors = this._monitors.map(m => m.id === id ? { ...m, ...data } : m);
|
|
}
|
|
deleteMonitor(id) {
|
|
this.monitors = this._monitors.filter(m => m.id !== id);
|
|
}
|
|
addIncident(incident) {
|
|
this.incidents = [...this._incidents, incident];
|
|
}
|
|
updateIncident(id, data) {
|
|
this.incidents = this._incidents.map(i => i.id === id ? { ...i, ...data } : i);
|
|
}
|
|
deleteIncident(id) {
|
|
this.incidents = this._incidents.filter(i => i.id !== id);
|
|
}
|
|
}
|
|
// Singleton instance
|
|
export const adminState = new AdminState();
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvc2VydmljZXMvYWRtaW4tc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUE7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQjtJQUNaLFNBQVMsR0FBaUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUU1RCxTQUFTLENBQUMsUUFBaUM7UUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQVE7UUFDWCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBQ3JCLDJDQUEyQztJQUNwQyxTQUFTLEdBQUcsSUFBSSxnQkFBZ0IsRUFBb0IsQ0FBQztJQUNyRCxVQUFVLEdBQUcsSUFBSSxnQkFBZ0IsRUFBc0IsQ0FBQztJQUN4RCxPQUFPLEdBQUcsSUFBSSxnQkFBZ0IsRUFBcUIsQ0FBQztJQUUzRCxlQUFlO0lBQ1AsU0FBUyxHQUFxQixFQUFFLENBQUM7SUFDakMsVUFBVSxHQUF1QixFQUFFLENBQUM7SUFDcEMsT0FBTyxHQUE2QixJQUFJLENBQUM7SUFFakQsd0NBQXdDO0lBQ2hDLGdCQUFnQixHQUEwQixJQUFJLENBQUM7SUFDL0MsaUJBQWlCLEdBQTRCLElBQUksQ0FBQztJQUUxRCxXQUFXO0lBQ1gsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxLQUF1QjtRQUNsQyxJQUFJ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
|