@memberjunction/ng-shared v2.48.0
@memberjunction/ng-shared
Utility functions and reusable components used across MemberJunction Explorer Angular packages.
Note: This package is intended for internal use within MJ Explorer and should not be used independently outside of the MemberJunction Explorer application.
Features
- Shared services for consistent application behavior
- Base components for navigation and resource management
- Resource type management
- Notification system integration
- Event management
- DOM utilities
- Angular pipes for text and URL formatting
Installation
npm install @memberjunction/ng-sharedDependencies
Peer Dependencies
@angular/common: ^18.0.2@angular/core: ^18.0.2rxjs: ^7.8.1
Core Dependencies
@memberjunction/core: Provides core functionality and metadata management@memberjunction/core-entities: Entity definitions and resource management@memberjunction/ng-notifications: Notification system integration@memberjunction/ng-base-types: Base Angular component types@memberjunction/graphql-dataprovider: GraphQL data provider for API communication@progress/kendo-angular-notification: UI notification components
Module Import
import { MemberJunctionSharedModule } from '@memberjunction/ng-shared';
@NgModule({
imports: [
MemberJunctionSharedModule
// ... other imports
]
})
export class YourModule { }Key Components
SharedService
A singleton service that provides application-wide functionality:
import { SharedService } from '@memberjunction/ng-shared';
// Get singleton instance
const service = SharedService.Instance;
// Access session ID
const sessionId = service.SessionId;
// Access resource types
const viewResourceType = service.ViewResourceType;
const recordResourceType = service.RecordResourceType;
const dashboardResourceType = service.DashboardResourceType;
const reportResourceType = service.ReportResourceType;
const searchResultsResourceType = service.SearchResultsResourceType;
const listResourceType = service.ListResourceType;
// Get resource type by ID or name
const resourceTypeById = service.ResourceTypeByID('some-id');
const resourceTypeByName = service.ResourceTypeByName('reports');
// Format column values
const formattedValue = service.FormatColumnValue(column, value, maxLength, '...');
// Create notifications (Note: prefer MJNotificationService for new code)
service.CreateSimpleNotification('Operation completed', 'success', 3000);
// Convert between route segments and resource type names
const routeSegment = service.mapResourceTypeNameToRouteSegment('user views'); // returns 'view'
const resourceTypeName = service.mapResourceTypeRouteSegmentToName('view'); // returns 'user views'Base Components
BaseNavigationComponent
Base class for all MJ Explorer navigation components that can be displayed from a route:
import { Component } from '@angular/core';
import { BaseNavigationComponent } from '@memberjunction/ng-shared';
@Component({
selector: 'app-your-navigation',
templateUrl: './your-navigation.component.html'
})
export class YourNavigationComponent extends BaseNavigationComponent {
// Inherits from BaseAngularComponent
// Provides foundation for routable components
}BaseResourceComponent
Extended base class for components that work with MemberJunction resources:
import { Component } from '@angular/core';
import { BaseResourceComponent } from '@memberjunction/ng-shared';
import { ResourceData } from '@memberjunction/core-entities';
@Component({
selector: 'app-your-resource',
templateUrl: './your-resource.component.html'
})
export class YourResourceComponent extends BaseResourceComponent {
// Access resource data
ngOnInit() {
console.log(this.Data); // ResourceData object
}
// Required abstract methods
async GetResourceDisplayName(data: ResourceData): Promise<string> {
// Return display name based on resource data
return `Resource: ${data.ResourceRecordID}`;
}
async GetResourceIconClass(data: ResourceData): Promise<string> {
// Return Font Awesome icon class
return 'fa-solid fa-file';
}
// Lifecycle notifications
protected onLoad() {
this.NotifyLoadStarted();
// ... load resource data
this.NotifyLoadComplete();
}
// Handle resource save
protected async saveResource() {
const entity = await this.getResourceEntity();
if (await entity.Save()) {
this.ResourceRecordSaved(entity);
}
}
}Angular Pipes
URLPipe (formatUrl)
Ensures URLs have proper protocol prefix:
// In template
<a [href]="website | formatUrl">Visit Site</a>
// Transforms:
// "example.com" → "https://example.com"
// "http://example.com" → "http://example.com" (unchanged)SimpleTextFormatPipe (formatText)
Converts plain text formatting to HTML:
// In template
<div [innerHTML]="description | formatText"></div>
// Transforms:
// "Line 1\nLine 2" → "Line 1<br>Line 2"
// "Text\tIndented" → "Text Indented"Utilities
Format Utilities
// Convert Markdown list to HTML
const htmlList = service.ConvertMarkdownStringToHtmlList('Unordered', '- Item 1\n- Item 2');
// Result: <ul><li>Item 1</li><li>Item 2</li></ul>
const orderedList = service.ConvertMarkdownStringToHtmlList('Ordered', '1. First\n2. Second');
// Result: <ol><li>First</li><li>Second</li></ol>DOM Utilities
// Check if one element is a descendant of another
const isDescendant = SharedService.IsDescendant(parentRef, childRef);
// Trigger manual window resize event (useful for responsive components)
service.InvokeManualResize(50); // 50ms delayPush Status Updates
// Subscribe to server push updates
service.PushStatusUpdates().subscribe(status => {
console.log('Server status:', status);
});Event Codes
Predefined event codes for standardized application event handling:
import { EventCodes } from '@memberjunction/ng-shared';
// Available event codes:
EventCodes.ViewClicked // User clicked on a view
EventCodes.EntityRecordClicked // User clicked on an entity record
EventCodes.AddDashboard // Request to add a dashboard
EventCodes.AddReport // Request to add a report
EventCodes.AddQuery // Request to add a query
EventCodes.ViewCreated // View was created
EventCodes.ViewUpdated // View was updated
EventCodes.RunSearch // Execute a search
EventCodes.ViewNotifications // View notifications panel
EventCodes.PushStatusUpdates // Server push status updates
EventCodes.UserNotificationsUpdated // User notifications changed
EventCodes.CloseCurrentTab // Close current tab
EventCodes.ListCreated // List was created
EventCodes.ListClicked // User clicked on a listIntegration with Other MJ Packages
This package seamlessly integrates with:
- @memberjunction/core: Uses Metadata for entity access and logging
- @memberjunction/core-entities: Works with ResourceTypeEntity, UserNotificationEntity, and ResourceData
- @memberjunction/ng-notifications: Delegates notification functionality to the dedicated notification service
- @memberjunction/global: Uses global event system and utilities
Migration Notes
Deprecated Methods
Several notification-related methods in SharedService are deprecated in favor of MJNotificationService:
// Deprecated
SharedService.UserNotifications
SharedService.UnreadUserNotifications
SharedService.UnreadUserNotificationCount
service.CreateNotification(...)
SharedService.RefreshUserNotifications()
service.CreateSimpleNotification(...)
// Use instead
import { MJNotificationService } from '@memberjunction/ng-notifications';
MJNotificationService.UserNotifications
MJNotificationService.UnreadUserNotifications
MJNotificationService.UnreadUserNotificationCount
mjNotificationService.CreateNotification(...)
MJNotificationService.RefreshUserNotifications()
mjNotificationService.CreateSimpleNotification(...)Build
To build this package:
cd packages/Angular/Explorer/shared
npm run buildThe build uses Angular's ngc compiler and outputs to the dist directory.
8 months ago
9 months ago
5 months ago
9 months ago
8 months ago
6 months ago
7 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
6 months ago
9 months ago
6 months ago
9 months ago
5 months ago
5 months ago
9 months ago
9 months ago
5 months ago
9 months ago
8 months ago
8 months ago
6 months ago
9 months ago
9 months ago
9 months ago
9 months ago
6 months ago
6 months ago
10 months ago
9 months ago
5 months ago
5 months ago
8 months ago
8 months ago
8 months ago
8 months ago
4 months ago
7 months ago
7 months ago
7 months ago
9 months ago
10 months ago
6 months ago
11 months ago
10 months ago
11 months ago
6 months ago
11 months ago
5 months ago
9 months ago
9 months ago
9 months ago
9 months ago
8 months ago
5 months ago
8 months ago
8 months ago
7 months ago
12 months ago
5 months ago
9 months ago
6 months ago
6 months ago
9 months ago
5 months ago
5 months ago
9 months ago
12 months ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago