Files
catalog_admin/dist_ts_web/services/admin-state.js

125 lines
8.3 KiB
JavaScript
Raw Normal View History

2025-12-24 10:57:43 +00:00
/**
* 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvc2VydmljZXMvYWRtaW4tc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUE7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQjtJQUNaLFNBQVMsR0FBaUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUU1RCxTQUFTLENBQUMsUUFBaUM7UUFDekMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsSUFBSSxDQUFDLEtBQVE7UUFDWCxLQUFLLE1BQU0sUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBQ3JCLDJDQUEyQztJQUNwQyxTQUFTLEdBQUcsSUFBSSxnQkFBZ0IsRUFBb0IsQ0FBQztJQUNyRCxVQUFVLEdBQUcsSUFBSSxnQkFBZ0IsRUFBc0IsQ0FBQztJQUN4RCxPQUFPLEdBQUcsSUFBSSxnQkFBZ0IsRUFBcUIsQ0FBQztJQUUzRCxlQUFlO0lBQ1AsU0FBUyxHQUFxQixFQUFFLENBQUM7SUFDakMsVUFBVSxHQUF1QixFQUFFLENBQUM7SUFDcEMsT0FBTyxHQUE2QixJQUFJLENBQUM7SUFFakQsd0NBQXdDO0lBQ2hDLGdCQUFnQixHQUEwQixJQUFJLENBQUM7SUFDL0MsaUJBQWlCLEdBQTRCLElBQUksQ0FBQztJQUUxRCxXQUFXO0lBQ1gsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxLQUF1QjtRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsWUFBWTtJQUNaLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBeUI7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELFNBQVM7SUFDVCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEtBQStCO1FBQ3hDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxrQkFBa0IsQ0FBQyxPQUE4QjtRQUMvQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVELG9CQUFvQjtRQUNsQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsbUJBQW1CLENBQUMsUUFBaUM7UUFDbkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLGFBQWE7UUFDWCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBQ3JDLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3JDLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNyQixVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsY0FBYyxDQUFDLEVBQVU7UUFDdkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELGVBQWUsQ0FBQyxFQUFVO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDM0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQ3BELENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDM0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxVQUFVLENBQUMsT0FBdUI7UUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsYUFBYSxDQUFDLEVBQVUsRUFBRSxJQUErQjtRQUN2RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3JDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQ