Plugin UI Module
The plugin management UI is an Angular 18+ module providing end users with marketplace discovery, plugin installation, configuration, and lifecycle management.
Technology Stackβ
- Angular with standalone components and
OnPushchange detection strategy - Akita for predictable, entity-oriented state management
@ngneat/effectsand@ngneat/effects-ngfor declarative side effect management- Nebular as the primary UI component library
- Angular2SmartTable for tabular data presentation
- RxJS for reactive data flow composition
Module Structureβ
plugins/
βββ component/
β βββ +state/ # Cross-cutting state management
β βββ add-plugin/ # Installation source selection dialog
β βββ plugin-marketplace/ # Marketplace browser
β β βββ +state/
β β βββ plugin-marketplace-item/
β β βββ plugin-marketplace-upload/
β β βββ plugin-marketplace-filter/
β β βββ plugin-subscription-plan-selection/
β β βββ plugin-settings-management/
β β βββ plugin-user-management/
β βββ plugin-list/ # Installed plugins table
β βββ plugin-layout/ # Top-level navigation
β βββ plugin/ # Plugin renderer view
β βββ upload-selection/ # Install vs. Publish intent dialog
β βββ pending-installation-dialog/
βββ services/
β βββ builders/
β βββ factories/
β βββ resolvers/
β βββ strategies/
β βββ *.service.ts
βββ domain/
β βββ commands/
β βββ interfaces/
βββ guards/
βββ shared/
Routing Topologyβ
/plugins
βββ /marketplace # Plugin marketplace (default)
β βββ / # Marketplace list view
β βββ /:id # Plugin detail view
β β βββ /overview # Descriptive overview tab
β β βββ /source-code # Source code tab
β β βββ /user-management # Access control tab
β β βββ /settings # Configuration tab
β βββ /:id/versions # Version history
βββ /installed # Installed plugins list
βββ / # Installed list view
βββ /:name # Plugin renderer view
State Managementβ
Three primary Akita stores govern the UI state:
PluginStoreβ
Manages the collection of locally installed plugins and their activation states, along with in-progress flags that drive loading indicators.
PluginMarketplaceStoreβ
export interface PluginMarketplaceState {
plugins: IPlugin[];
count: number;
filters: IPluginFilter;
appliedFilters: IPluginFilter;
viewMode: "grid" | "list";
showAdvancedFilters: boolean;
loading: boolean;
}
PluginSubscriptionStoreβ
Holds the current user's subscription collection and the active subscription being managed.
Effects Patternβ
export const PluginMarketplaceEffects = {
getAll$: createEffect((actions$) =>
actions$.pipe(
ofType(PluginMarketplaceActions.getAll),
switchMap(({ params }) =>
this.pluginService.getAll(params).pipe(
map(({ items, total }) =>
PluginMarketplaceActions.getAllSuccess({
plugins: items,
count: total,
}),
),
),
),
),
),
};
Principal UI Componentsβ
| Component | Description |
|---|---|
| PluginLayoutComponent | Top-level navigation with tab-based access to marketplace and installed plugins |
| PluginMarketplaceComponent | Full marketplace browsing with grid/list modes, multi-criteria filtering, and infinite scroll |
| PluginListComponent | Installed plugins as a sortable, paginated smart table with inline activation toggling |
| PluginMarketplaceDetailComponent | Tabbed deep-dive: overview, access control, configuration, subscriptions, and analytics |
Dynamic Component Loadingβ
The PluginLoaderService enables dynamic loading of Angular components exported by installed plugins at runtime. It handles standalone and NgModule-based components uniformly, with graceful degradation through a fallback component.
Supporting Servicesβ
| Service | Responsibility |
|---|---|
PluginCategoryService | Manage taxonomic categories for marketplace classification |
PluginTagsService | Manage keyword-based tag associations |
PluginAnalyticsService | Track and expose usage metrics and download statistics |
PluginLoaderService | Dynamically instantiate plugin-contributed Angular components |
PluginEnvironmentService | Resolve environment-specific configuration parameters |
PluginSettingsService | Persist and retrieve per-plugin configuration data |
PluginUserAssignmentService | Manage per-user plugin access assignments |
PluginSubscriptionAccessService | Enforce subscription-tier access gates |
UserSubscribedPluginsService | Aggregate the current user's active subscriptions |
PluginSecurityService | Govern permissions, API keys, and security scan orchestration |
Security Service Operationsβ
getPluginSecurity(pluginId); // Retrieve security configuration
getPluginPermissions(pluginId); // Retrieve declared permissions
createPermission(permission); // Grant a new permission
getApiKeys(pluginId); // Retrieve API key inventory
createApiKey(pluginId, name, permissions); // Provision a scoped API key
initiateScan(pluginId, config); // Launch an asynchronous security scan
getComplianceStatus(pluginId); // Retrieve compliance assessment results
Publication Workflowβ
Developers publishing a plugin complete a multi-step form:
- Basic Information: Display name, description, type, status, category, author, license, and URLs
- Version Information: Semantic version, changelog (min. 10 chars), release date, and source descriptors
- Platform-Specific Sources: One or more source descriptors targeting specific OS and architecture combinations
- Subscription Plans (conditional): Pricing, billing period, feature entitlements, and trial parameters