mirror of
https://github.com/fleetbase/fleetbase.git
synced 2025-12-19 22:27:22 +00:00
## Changes
### Removed Old Instance Initializers
- Deleted `app/instance-initializers/load-extensions.js` (used bootEngines)
- Deleted `app/instance-initializers/initialize-widgets.js` (now in initialize-universe)
### Created New Instance Initializer
- `app/instance-initializers/initialize-universe.js`
- Creates console-specific registries
- Registers default dashboard widgets using WidgetService
- Loads extension.js files from enabled extensions
- No longer calls bootEngines (enables lazy loading)
### Migrated Application Route
- `app/routes/application.js`
- Replaced `@service universe` with specialized services
- Uses `@service('universe/hook-service')` for hook execution
- Uses `@service('universe/extension-manager')` for boot waiting
- `universe.callHooks()` → `hookService.execute()`
- `universe.booting()` → `extensionManager.waitForBoot()`
### Migrated Dashboard Widget Panel
- `app/components/dashboard/widget-panel.js`
- Replaced `@service universe` with `@service('universe/widget-service')`
- `universe.getDashboardWidgets()` → `widgetService.getWidgets('dashboard')`
### Migrated Dashboard Model
- `app/models/dashboard.js`
- `universe.getDashboardRegistry()` → `widgetService.getRegistry()`
- Looks up `service:universe/widget-service` instead of `service:universe`
### What Stayed the Same
- `app/controllers/console.js` - Event system usage unchanged
- `app/controllers/console/notifications.js` - Event system usage unchanged
- Event system (`on`, `trigger`) remains on Universe facade
## Benefits
- ✅ Enables true lazy loading (engines load on-demand)
- ✅ Separation of concerns via specialized services
- ✅ Clearer service responsibilities
- ✅ Better performance (no bootEngines at startup)
- ✅ Maintains backward compatibility for events
82 lines
2.9 KiB
JavaScript
82 lines
2.9 KiB
JavaScript
import { getOwner } from '@ember/application';
|
|
import { scheduleOnce } from '@ember/runloop';
|
|
import { Widget } from '@fleetbase/ember-core/contracts';
|
|
|
|
/**
|
|
* Initializes the Universe by:
|
|
* 1. Creating console-specific registries
|
|
* 2. Registering default dashboard widgets
|
|
* 3. Loading extension.js files from enabled extensions
|
|
* 4. Executing boot callbacks
|
|
*
|
|
* This replaces the old load-extensions and initialize-widgets initializers.
|
|
*
|
|
* @param {ApplicationInstance} appInstance The application instance
|
|
*/
|
|
export function initialize(appInstance) {
|
|
const universe = appInstance.lookup('service:universe');
|
|
const widgetService = appInstance.lookup('service:universe/widget-service');
|
|
const registryService = appInstance.lookup('service:universe/registry-service');
|
|
const owner = getOwner(appInstance);
|
|
const app = owner.application;
|
|
|
|
// Set application instance on universe
|
|
universe.applicationInstance = appInstance;
|
|
|
|
// Create console-specific registries
|
|
registryService.createRegistries(['@fleetbase/console', 'auth:login']);
|
|
|
|
// Register default dashboard widgets
|
|
const defaultWidgets = [
|
|
new Widget({
|
|
widgetId: 'welcome',
|
|
name: 'Welcome',
|
|
description: 'Welcome widget for new users',
|
|
icon: 'hand-wave',
|
|
component: 'widget/welcome',
|
|
grid_options: { w: 12, h: 6, minW: 8, minH: 6 }
|
|
}),
|
|
new Widget({
|
|
widgetId: 'getting-started',
|
|
name: 'Getting Started',
|
|
description: 'Getting started guide',
|
|
icon: 'rocket',
|
|
component: 'widget/getting-started',
|
|
grid_options: { w: 12, h: 12, minW: 8, minH: 12 }
|
|
})
|
|
];
|
|
|
|
widgetService.registerDefaultWidgets(defaultWidgets);
|
|
widgetService.registerWidgets('dashboard', defaultWidgets);
|
|
|
|
// Load extension.js files from enabled extensions
|
|
// The app.extensions array already respects config + user permissions
|
|
const extensions = app.extensions || [];
|
|
|
|
extensions.forEach(extensionName => {
|
|
try {
|
|
// Dynamically require the extension.js file
|
|
// This is a small file with only metadata, not the full engine bundle
|
|
const setupExtension = require(`${extensionName}/extension`).default;
|
|
|
|
if (typeof setupExtension === 'function') {
|
|
// Execute the extension setup function
|
|
// This registers menus, widgets, hooks, etc. as metadata
|
|
setupExtension(appInstance, universe);
|
|
}
|
|
} catch (error) {
|
|
// Silently fail if extension.js doesn't exist
|
|
// Extensions can migrate gradually to the new pattern
|
|
// console.warn(`Could not load extension.js for ${extensionName}:`, error);
|
|
}
|
|
});
|
|
|
|
// Execute any boot callbacks
|
|
scheduleOnce('afterRender', universe, 'executeBootCallbacks');
|
|
}
|
|
|
|
export default {
|
|
name: 'initialize-universe',
|
|
initialize
|
|
};
|