Skip to main content

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 OnPush change detection strategy
  • Akita for predictable, entity-oriented state management
  • @ngneat/effects and @ngneat/effects-ng for 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โ€‹

ComponentDescription
PluginLayoutComponentTop-level navigation with tab-based access to marketplace and installed plugins
PluginMarketplaceComponentFull marketplace browsing with grid/list modes, multi-criteria filtering, and infinite scroll
PluginListComponentInstalled plugins as a sortable, paginated smart table with inline activation toggling
PluginMarketplaceDetailComponentTabbed 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โ€‹

ServiceResponsibility
PluginCategoryServiceManage taxonomic categories for marketplace classification
PluginTagsServiceManage keyword-based tag associations
PluginAnalyticsServiceTrack and expose usage metrics and download statistics
PluginLoaderServiceDynamically instantiate plugin-contributed Angular components
PluginEnvironmentServiceResolve environment-specific configuration parameters
PluginSettingsServicePersist and retrieve per-plugin configuration data
PluginUserAssignmentServiceManage per-user plugin access assignments
PluginSubscriptionAccessServiceEnforce subscription-tier access gates
UserSubscribedPluginsServiceAggregate the current user's active subscriptions
PluginSecurityServiceGovern 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:

  1. Basic Information: Display name, description, type, status, category, author, license, and URLs
  2. Version Information: Semantic version, changelog (min. 10 chars), release date, and source descriptors
  3. Platform-Specific Sources: One or more source descriptors targeting specific OS and architecture combinations
  4. Subscription Plans (conditional): Pricing, billing period, feature entitlements, and trial parameters