refactor: use resetLayout() for first-run initialization
Refactored loadLayout() to call resetLayout() for first-run users instead of duplicating setup logic inline. This provides a single source of truth for "set to default layout" behavior. Previous Approach (Problems): - loadLayout() had ~40 lines of inline first-run setup - Different behavior: used autoLayout (repositions widgets) - Less comprehensive: no state reset, different persistence method - Code duplication between loadLayout() and resetLayout() - Error handler also duplicated applyDashboardConfig() logic - Emergency fallback tab creation needed after load New Approach (Benefits): - loadLayout() is now a simple router: saved layout vs. reset - Consistent behavior: first-run and manual reset use same code path - More comprehensive: fresh layout generation, state reset, validation - Better error recovery: always uses resetLayout() for clean state - Single source of truth for default layout initialization - ~40 lines removed, cleaner code Changes: 1. Removed inline applyDashboardConfig(defaultLayout) for first run 2. Removed manual autoLayout() loop (lines 1489-1494) 3. Removed manual saveLayout() call (line 1497) 4. Removed error handler's inline applyDashboardConfig() 5. Removed emergency fallback tab creation (lines 1506-1520) 6. Added resetLayout() call for first run (line 1494) 7. Added resetLayout() call for error recovery (line 1500) Result: - First-run users get comprehensive setup via resetLayout() - Preserves default positions (doesn't reposition with autoLayout) - Consistent layout behavior across first-run and manual reset - Better maintainability (single code path for default setup) - Proven reliability (resetLayout already works in production)
This commit is contained in:
@@ -1475,48 +1475,29 @@ export class DashboardManager {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Load saved layout
|
* Load saved layout
|
||||||
|
*
|
||||||
|
* For first-run users (no saved layout), calls resetLayout() for comprehensive
|
||||||
|
* initialization. This ensures consistent behavior between first-run and manual
|
||||||
|
* reset, using a single code path for default layout setup.
|
||||||
*/
|
*/
|
||||||
async loadLayout() {
|
async loadLayout() {
|
||||||
try {
|
try {
|
||||||
const saved = await this.persistence.loadLayout();
|
const saved = await this.persistence.loadLayout();
|
||||||
if (saved) {
|
if (saved) {
|
||||||
|
console.log('[DashboardManager] Loading saved layout');
|
||||||
this.applyDashboardConfig(saved);
|
this.applyDashboardConfig(saved);
|
||||||
} else if (this.defaultLayout) {
|
} else {
|
||||||
console.log('[DashboardManager] No saved layout, using default with auto-layout');
|
// First run - use resetLayout() for comprehensive initialization
|
||||||
this.applyDashboardConfig(this.defaultLayout);
|
// This provides: fresh layout generation, state reset, validation,
|
||||||
|
// column-aware sizing, and proper UI rendering
|
||||||
// Auto-layout each tab to prevent overlap (default positions may not fit screen)
|
console.log('[DashboardManager] No saved layout found, calling resetLayout() for first-run initialization');
|
||||||
this.dashboard.tabs.forEach(tab => {
|
await this.resetLayout();
|
||||||
if (tab.widgets && tab.widgets.length > 0) {
|
|
||||||
console.log(`[DashboardManager] Auto-laying out default tab "${tab.name}" (${tab.widgets.length} widgets)`);
|
|
||||||
this.gridEngine.autoLayout(tab.widgets, { preserveOrder: true });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Save the auto-laid-out default as the initial saved layout
|
|
||||||
await this.saveLayout(true);
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[DashboardManager] Failed to load layout:', error);
|
console.error('[DashboardManager] Failed to load layout:', error);
|
||||||
if (this.defaultLayout) {
|
// Fallback: use resetLayout() for clean state recovery
|
||||||
this.applyDashboardConfig(this.defaultLayout);
|
console.log('[DashboardManager] Recovering with resetLayout()');
|
||||||
}
|
await this.resetLayout();
|
||||||
}
|
|
||||||
|
|
||||||
// Safety check: If still no tabs after loading, create emergency fallback
|
|
||||||
// This should never happen if setDefaultLayout() was called properly
|
|
||||||
if (this.dashboard.tabs.length === 0) {
|
|
||||||
console.warn('[DashboardManager] No tabs loaded, creating emergency fallback');
|
|
||||||
this.dashboard.tabs.push({
|
|
||||||
id: 'tab-status',
|
|
||||||
name: 'Status',
|
|
||||||
icon: 'fa-solid fa-user',
|
|
||||||
order: 0,
|
|
||||||
widgets: []
|
|
||||||
});
|
|
||||||
this.dashboard.defaultTab = 'tab-status';
|
|
||||||
// Update TabManager's active tab
|
|
||||||
this.tabManager.setActiveTab('tab-status');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user