@memberjunction/ng-shared 0.9.3 → 0.9.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,34 @@
1
+ import { BaseEntity } from "@memberjunction/core";
2
+ export declare abstract class BaseResourceComponent {
3
+ Data: ResourceData;
4
+ private _loadComplete;
5
+ get LoadComplete(): boolean;
6
+ private _loadStarted;
7
+ get LoadStarted(): boolean;
8
+ private _loadCompleteEvent;
9
+ get LoadCompleteEvent(): any;
10
+ set LoadCompleteEvent(value: any);
11
+ private _loadStartedEvent;
12
+ get LoadStartedEvent(): any;
13
+ set LoadStartedEvent(value: any);
14
+ private _resourceRecordSavedEvent;
15
+ get ResourceRecordSavedEvent(): any;
16
+ set ResourceRecordSavedEvent(value: any);
17
+ protected NotifyLoadComplete(): void;
18
+ protected NotifyLoadStarted(): void;
19
+ protected ResourceRecordSaved(resourceRecordEntity: BaseEntity): void;
20
+ abstract GetResourceDisplayName(data: ResourceData): Promise<string>;
21
+ }
22
+ export declare class ResourceData {
23
+ constructor(data?: any);
24
+ ID: number;
25
+ Name: string;
26
+ ResourceTypeID: number;
27
+ ResourceRecordID: any;
28
+ Configuration: any;
29
+ /**
30
+ * Returns the name of the resource type based on the ResourceTypeID
31
+ */
32
+ get ResourceType(): string;
33
+ get ResourceIcon(): string;
34
+ }
@@ -0,0 +1,75 @@
1
+ import { SharedService } from "./shared.service";
2
+ export class BaseResourceComponent {
3
+ constructor() {
4
+ this.Data = new ResourceData();
5
+ this._loadComplete = false;
6
+ this._loadStarted = false;
7
+ this._loadCompleteEvent = null;
8
+ this._loadStartedEvent = null;
9
+ this._resourceRecordSavedEvent = null;
10
+ }
11
+ get LoadComplete() {
12
+ return this._loadComplete;
13
+ }
14
+ get LoadStarted() {
15
+ return this._loadStarted;
16
+ }
17
+ get LoadCompleteEvent() {
18
+ return this._loadCompleteEvent;
19
+ }
20
+ set LoadCompleteEvent(value) {
21
+ this._loadCompleteEvent = value;
22
+ }
23
+ get LoadStartedEvent() {
24
+ return this._loadStartedEvent;
25
+ }
26
+ set LoadStartedEvent(value) {
27
+ this._loadStartedEvent = value;
28
+ }
29
+ get ResourceRecordSavedEvent() {
30
+ return this._resourceRecordSavedEvent;
31
+ }
32
+ set ResourceRecordSavedEvent(value) {
33
+ this._resourceRecordSavedEvent = value;
34
+ }
35
+ NotifyLoadComplete() {
36
+ this._loadComplete = true;
37
+ if (this._loadCompleteEvent) {
38
+ this._loadCompleteEvent();
39
+ }
40
+ }
41
+ NotifyLoadStarted() {
42
+ this._loadStarted = true;
43
+ if (this._loadStartedEvent) {
44
+ this._loadStartedEvent();
45
+ }
46
+ }
47
+ ResourceRecordSaved(resourceRecordEntity) {
48
+ this.Data.ResourceRecordID = resourceRecordEntity.PrimaryKey.Value;
49
+ if (this._resourceRecordSavedEvent) {
50
+ this._resourceRecordSavedEvent(resourceRecordEntity);
51
+ }
52
+ }
53
+ }
54
+ export class ResourceData {
55
+ constructor(data = null) {
56
+ if (data) {
57
+ this.ID = data.ID;
58
+ this.Name = data.Name;
59
+ this.ResourceTypeID = data.ResourceTypeID;
60
+ this.ResourceRecordID = data.ResourceRecordID;
61
+ this.Configuration = data.Configuration;
62
+ }
63
+ }
64
+ /**
65
+ * Returns the name of the resource type based on the ResourceTypeID
66
+ */
67
+ get ResourceType() {
68
+ const rt = SharedService.Instance.ResourceTypes.find(rt => rt.ID === this.ResourceTypeID);
69
+ return rt ? rt.Name : '';
70
+ }
71
+ get ResourceIcon() {
72
+ const rt = SharedService.Instance.ResourceTypes.find(rt => rt.ID === this.ResourceTypeID);
73
+ return rt ? rt.Icon : '';
74
+ }
75
+ }
@@ -0,0 +1,94 @@
1
+ import { EntityInfo, PrimaryKeyValue } from '@memberjunction/core';
2
+ import { ResourceTypeEntity, UserNotificationEntity, ViewColumnInfo } from '@memberjunction/core-entities';
3
+ import { Observable } from 'rxjs';
4
+ import { NotificationService } from "@progress/kendo-angular-notification";
5
+ import * as i0 from "@angular/core";
6
+ export declare class SharedService {
7
+ private notificationService;
8
+ private static _instance;
9
+ private static _loaded;
10
+ private static _resourceTypes;
11
+ private tabChange;
12
+ tabChange$: Observable<unknown>;
13
+ constructor(notificationService: NotificationService);
14
+ static get Instance(): SharedService;
15
+ /**
16
+ * Returns the current session ID, which is automatically created when the service is instantiated.
17
+ */
18
+ get SessionId(): string;
19
+ get ResourceTypes(): ResourceTypeEntity[];
20
+ get ViewResourceType(): ResourceTypeEntity;
21
+ get RecordResourceType(): ResourceTypeEntity;
22
+ get DashboardResourceType(): ResourceTypeEntity;
23
+ get ReportResourceType(): ResourceTypeEntity;
24
+ get SearchResultsResourceType(): ResourceTypeEntity;
25
+ ResourceTypeByID(id: number): ResourceTypeEntity | undefined;
26
+ ResourceTypeByName(name: string): ResourceTypeEntity | undefined;
27
+ static RefreshData(): Promise<void>;
28
+ static GeneratePrimaryKeyValueString(pkVals: PrimaryKeyValue[]): string;
29
+ static ParsePrimaryKeys(entity: EntityInfo, routeSegment: string): PrimaryKeyValue[];
30
+ FormatColumnValue(col: ViewColumnInfo, value: any, maxLength?: number, trailingChars?: string): any;
31
+ ConvertMarkdownStringToHtmlList(listType: HtmlListType, text: string): string;
32
+ InvokeManualResize(delay?: number): void;
33
+ PushStatusUpdates(): Observable<string>;
34
+ private _currentUserImage;
35
+ get CurrentUserImage(): string | Blob;
36
+ set CurrentUserImage(value: string | Blob);
37
+ private static _userNotifications;
38
+ static get UserNotifications(): UserNotificationEntity[];
39
+ static get UnreadUserNotifications(): UserNotificationEntity[];
40
+ static get UnreadUserNotificationCount(): number;
41
+ /**
42
+ * Creates a notification in the database and refreshes the UI. Returns the notification object.
43
+ * @param title
44
+ * @param message
45
+ * @param resourceTypeId
46
+ * @param resourceRecordId
47
+ * @param resourceConfiguration Any object, it is converted to a string by JSON.stringify and stored in the database
48
+ * @returns
49
+ */
50
+ CreateNotification(title: string, message: string, resourceTypeId: number | null, resourceRecordId: number | null, resourceConfiguration: any | null): Promise<UserNotificationEntity>;
51
+ static RefreshUserNotifications(): Promise<void>;
52
+ /**
53
+ * Creates a message that is not saved to the User Notifications table, but is displayed to the user.
54
+ * @param message - text to display
55
+ * @param style - display styling
56
+ * @param hideAfter - option to auto hide after the specified delay in milliseconds
57
+ */
58
+ CreateSimpleNotification(message: string, style?: "none" | "success" | "error" | "warning" | "info", hideAfter?: number): void;
59
+ private _resourceTypeMap;
60
+ /**
61
+ * Maps a Resource Type record Name column to the corresponding route segment
62
+ * @param resourceTypeName
63
+ * @returns
64
+ */
65
+ mapResourceTypeNameToRouteSegment(resourceTypeName: string): string | null;
66
+ /**
67
+ * Maps a route segment to the corresponding Resource Type record Name column
68
+ * @param resourceRouteSegment
69
+ * @returns
70
+ */
71
+ mapResourceTypeRouteSegmentToName(resourceRouteSegment: string): string | null;
72
+ kendoSVGIcon(iconName: string): any;
73
+ static ɵfac: i0.ɵɵFactoryDeclaration<SharedService, never>;
74
+ static ɵprov: i0.ɵɵInjectableDeclaration<SharedService>;
75
+ }
76
+ export declare const HtmlListType: {
77
+ readonly Unordered: "Unordered";
78
+ readonly Ordered: "Ordered";
79
+ };
80
+ export type HtmlListType = typeof HtmlListType[keyof typeof HtmlListType];
81
+ export declare const EventCodes: {
82
+ readonly ViewClicked: "ViewClicked";
83
+ readonly EntityRecordClicked: "EntityRecordClicked";
84
+ readonly AddDashboard: "AddDashboard";
85
+ readonly AddReport: "AddReport";
86
+ readonly AddQuery: "AddQuery";
87
+ readonly ViewCreated: "ViewCreated";
88
+ readonly ViewUpdated: "ViewUpdated";
89
+ readonly RunSearch: "RunSearch";
90
+ readonly ViewNotifications: "ViewNotifications";
91
+ readonly PushStatusUpdates: "PushStatusUpdates";
92
+ readonly UserNotificationsUpdated: "UserNotificationsUpdated";
93
+ };
94
+ export type EventCodes = typeof EventCodes[keyof typeof EventCodes];
@@ -0,0 +1,326 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { Injectable } from '@angular/core';
11
+ import { LogError, Metadata, RunView } from '@memberjunction/core';
12
+ import { MJEventType, MJGlobal } from '@memberjunction/global';
13
+ import { Subject } from 'rxjs';
14
+ import { kendoSVGIcon } from './util';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@progress/kendo-angular-notification";
17
+ export class SharedService {
18
+ constructor(notificationService) {
19
+ this.notificationService = notificationService;
20
+ this.tabChange = new Subject();
21
+ this.tabChange$ = this.tabChange.asObservable();
22
+ this._currentUserImage = '/assets/user.png';
23
+ this._resourceTypeMap = [
24
+ { routeSegment: 'record', name: 'records' },
25
+ { routeSegment: 'view', name: 'user views' },
26
+ { routeSegment: 'search', name: 'search results' },
27
+ { routeSegment: 'report', name: 'reports' },
28
+ { routeSegment: 'query', name: 'queries' },
29
+ { routeSegment: 'dashboard', name: 'dashboards' }
30
+ ];
31
+ if (SharedService._instance) {
32
+ // return existing instance which will short circuit the creation of a new instance
33
+ return SharedService._instance;
34
+ }
35
+ // first time this has been called, so return ourselves since we're in the constructor
36
+ SharedService._instance = this;
37
+ MJGlobal.Instance.GetEventListener(true).subscribe((event) => {
38
+ switch (event.event) {
39
+ case MJEventType.DisplaySimpleNotificationRequest:
40
+ // received the message to display a notification to the user, so do that...
41
+ const messageData = event.args;
42
+ this.CreateSimpleNotification(messageData.message, messageData.style, messageData.DisplayDuration);
43
+ break;
44
+ case MJEventType.ComponentEvent:
45
+ if (event.eventCode === EventCodes.UserNotificationsUpdated) {
46
+ // refresh the user notifications
47
+ SharedService.RefreshUserNotifications();
48
+ }
49
+ break;
50
+ case MJEventType.LoggedIn:
51
+ if (SharedService._loaded === false)
52
+ SharedService.RefreshData();
53
+ // got the login, now subscribe to push status updates here so we can then raise them as events in MJ Global locally
54
+ this.PushStatusUpdates().subscribe((status) => {
55
+ var _a, _b, _c;
56
+ const statusObj = JSON.parse(status.message);
57
+ // pass along as an event so anyone else who wants to know about the push status update can do stuff
58
+ MJGlobal.Instance.RaiseEvent({
59
+ event: MJEventType.ComponentEvent,
60
+ eventCode: EventCodes.PushStatusUpdates,
61
+ args: statusObj,
62
+ component: this
63
+ });
64
+ if (((_a = statusObj.type) === null || _a === void 0 ? void 0 : _a.trim().toLowerCase()) === 'usernotifications') {
65
+ if (statusObj.details && ((_b = statusObj.details.action) === null || _b === void 0 ? void 0 : _b.trim().toLowerCase()) === 'create') {
66
+ // we have changes to user notifications, so refresh them
67
+ this.CreateSimpleNotification('New Notification Available', "success", 2000);
68
+ SharedService.RefreshUserNotifications();
69
+ }
70
+ }
71
+ else {
72
+ // otherwise just post it as a simple notification, except Skip messages, we will let Skip handle those
73
+ if (((_c = statusObj.type) === null || _c === void 0 ? void 0 : _c.trim().toLowerCase()) !== 'askskip') {
74
+ this.CreateSimpleNotification(statusObj.message, "success", 2500);
75
+ }
76
+ }
77
+ });
78
+ break;
79
+ }
80
+ });
81
+ }
82
+ static get Instance() {
83
+ return SharedService._instance;
84
+ }
85
+ /**
86
+ * Returns the current session ID, which is automatically created when the service is instantiated.
87
+ */
88
+ get SessionId() {
89
+ return Metadata.Provider.sessionId;
90
+ }
91
+ get ResourceTypes() {
92
+ return SharedService._resourceTypes;
93
+ }
94
+ get ViewResourceType() {
95
+ return SharedService._resourceTypes.find(rt => rt.Name.trim().toLowerCase() === 'user views');
96
+ }
97
+ get RecordResourceType() {
98
+ return SharedService._resourceTypes.find(rt => rt.Name.trim().toLowerCase() === 'records');
99
+ }
100
+ get DashboardResourceType() {
101
+ return SharedService._resourceTypes.find(rt => rt.Name.trim().toLowerCase() === 'dashboards');
102
+ }
103
+ get ReportResourceType() {
104
+ return SharedService._resourceTypes.find(rt => rt.Name.trim().toLowerCase() === 'reports');
105
+ }
106
+ get SearchResultsResourceType() {
107
+ return SharedService._resourceTypes.find(rt => rt.Name.trim().toLowerCase() === 'search results');
108
+ }
109
+ ResourceTypeByID(id) {
110
+ return SharedService._resourceTypes.find(rt => rt.ID === id);
111
+ }
112
+ ResourceTypeByName(name) {
113
+ return SharedService._resourceTypes.find(rt => rt.Name.trim().toLowerCase() === name.trim().toLowerCase());
114
+ }
115
+ static RefreshData() {
116
+ return __awaiter(this, void 0, void 0, function* () {
117
+ // if we have a provider, then we can load the data, otherwise load isn't done yet
118
+ const md = new Metadata();
119
+ const rtResult = yield md.GetAndCacheDatasetByName('ResourceTypes');
120
+ if (rtResult && rtResult.Success) {
121
+ const data = rtResult.Results.find(r => r.EntityName === 'Resource Types');
122
+ if (data) {
123
+ SharedService._resourceTypes = data.Results;
124
+ SharedService._loaded = true;
125
+ }
126
+ }
127
+ SharedService.RefreshUserNotifications(); // also call this initially when refreshing the dataset...
128
+ });
129
+ }
130
+ static GeneratePrimaryKeyValueString(pkVals) {
131
+ return pkVals.map(pk => pk.FieldName + '|' + pk.Value).join('||');
132
+ }
133
+ static ParsePrimaryKeys(entity, routeSegment) {
134
+ if (!routeSegment.includes('|')) {
135
+ // If not, return a single element array with a default field name
136
+ return [{ FieldName: entity.PrimaryKey.Name, Value: routeSegment }];
137
+ }
138
+ else {
139
+ const parts = routeSegment.split('||');
140
+ const pkVals = [];
141
+ for (let p of parts) {
142
+ const kv = p.split('|');
143
+ pkVals.push({ FieldName: kv[0], Value: kv[1] });
144
+ }
145
+ return pkVals;
146
+ }
147
+ }
148
+ FormatColumnValue(col, value, maxLength = 0, trailingChars = "...") {
149
+ if (value === null || value === undefined)
150
+ return value;
151
+ try {
152
+ const retVal = col.EntityField.FormatValue(value, 0);
153
+ if (maxLength > 0 && retVal && retVal.length > maxLength)
154
+ return retVal.substring(0, maxLength) + trailingChars;
155
+ else
156
+ return retVal;
157
+ }
158
+ catch (e) {
159
+ LogError(e);
160
+ return value;
161
+ }
162
+ }
163
+ ConvertMarkdownStringToHtmlList(listType, text) {
164
+ const listTag = listType === HtmlListType.Unordered ? 'ul' : 'ol';
165
+ if (!text.includes('\n')) {
166
+ return text;
167
+ }
168
+ const listItems = text.split('\n').map(line => `<li>${line.trim().replace(/^-\s*/, '')}</li>`).join('');
169
+ return `<${listTag}>${listItems}</${listTag}>`;
170
+ }
171
+ InvokeManualResize(delay = 50) {
172
+ setTimeout(() => {
173
+ MJGlobal.Instance.RaiseEvent({
174
+ event: MJEventType.ManualResizeRequest,
175
+ eventCode: '',
176
+ args: null,
177
+ component: this
178
+ });
179
+ }, delay); // give the tabstrip time to render
180
+ }
181
+ PushStatusUpdates() {
182
+ const gp = Metadata.Provider;
183
+ return gp.PushStatusUpdates();
184
+ }
185
+ get CurrentUserImage() {
186
+ return this._currentUserImage;
187
+ }
188
+ set CurrentUserImage(value) {
189
+ this._currentUserImage = value;
190
+ }
191
+ static get UserNotifications() {
192
+ return SharedService._userNotifications;
193
+ }
194
+ static get UnreadUserNotifications() {
195
+ return SharedService._userNotifications.filter(n => n.Unread);
196
+ }
197
+ static get UnreadUserNotificationCount() {
198
+ return SharedService.UnreadUserNotifications.length;
199
+ }
200
+ /**
201
+ * Creates a notification in the database and refreshes the UI. Returns the notification object.
202
+ * @param title
203
+ * @param message
204
+ * @param resourceTypeId
205
+ * @param resourceRecordId
206
+ * @param resourceConfiguration Any object, it is converted to a string by JSON.stringify and stored in the database
207
+ * @returns
208
+ */
209
+ CreateNotification(title, message, resourceTypeId, resourceRecordId, resourceConfiguration) {
210
+ return __awaiter(this, void 0, void 0, function* () {
211
+ const md = new Metadata();
212
+ const notification = yield md.GetEntityObject('User Notifications');
213
+ notification.Title = title;
214
+ notification.Message = message;
215
+ if (resourceTypeId)
216
+ notification.ResourceTypeID = resourceTypeId;
217
+ if (resourceRecordId)
218
+ notification.ResourceRecordID = resourceRecordId;
219
+ if (resourceConfiguration)
220
+ notification.ResourceConfiguration = JSON.stringify(resourceConfiguration);
221
+ notification.UserID = md.CurrentUser.ID;
222
+ notification.Unread = true;
223
+ const result = yield notification.Save();
224
+ if (result) {
225
+ SharedService.RefreshUserNotifications();
226
+ }
227
+ // test
228
+ this.CreateSimpleNotification(notification.Message, "success", 2500);
229
+ return notification;
230
+ });
231
+ }
232
+ static RefreshUserNotifications() {
233
+ return __awaiter(this, void 0, void 0, function* () {
234
+ try {
235
+ const rv = new RunView();
236
+ const md = new Metadata();
237
+ const result = yield rv.RunView({
238
+ EntityName: 'User Notifications',
239
+ ExtraFilter: 'UserID=' + md.CurrentUser.ID,
240
+ OrderBy: 'CreatedAt DESC'
241
+ });
242
+ if (result && result.Success) {
243
+ SharedService._userNotifications = result.Results;
244
+ }
245
+ }
246
+ catch (e) {
247
+ LogError(e);
248
+ }
249
+ });
250
+ }
251
+ /**
252
+ * Creates a message that is not saved to the User Notifications table, but is displayed to the user.
253
+ * @param message - text to display
254
+ * @param style - display styling
255
+ * @param hideAfter - option to auto hide after the specified delay in milliseconds
256
+ */
257
+ CreateSimpleNotification(message, style = "success", hideAfter) {
258
+ const props = {
259
+ content: message,
260
+ cssClass: "button-notification",
261
+ animation: { type: "slide", duration: 400 },
262
+ position: { horizontal: "center", vertical: "top" },
263
+ type: { style: style, icon: true }
264
+ };
265
+ if (hideAfter)
266
+ props.hideAfter = hideAfter;
267
+ else
268
+ props.closable = true;
269
+ this.notificationService.show(props);
270
+ }
271
+ /**
272
+ * Maps a Resource Type record Name column to the corresponding route segment
273
+ * @param resourceTypeName
274
+ * @returns
275
+ */
276
+ mapResourceTypeNameToRouteSegment(resourceTypeName) {
277
+ const item = this._resourceTypeMap.find(rt => rt.name.trim().toLowerCase() === resourceTypeName.trim().toLowerCase());
278
+ if (item)
279
+ return item.routeSegment;
280
+ else
281
+ return null;
282
+ }
283
+ /**
284
+ * Maps a route segment to the corresponding Resource Type record Name column
285
+ * @param resourceRouteSegment
286
+ * @returns
287
+ */
288
+ mapResourceTypeRouteSegmentToName(resourceRouteSegment) {
289
+ const item = this._resourceTypeMap.find(rt => rt.routeSegment.trim().toLowerCase() === resourceRouteSegment.trim().toLowerCase());
290
+ if (item)
291
+ return item.name;
292
+ else
293
+ return null;
294
+ }
295
+ kendoSVGIcon(iconName) {
296
+ return kendoSVGIcon(iconName);
297
+ }
298
+ }
299
+ SharedService._loaded = false;
300
+ SharedService._resourceTypes = [];
301
+ SharedService._userNotifications = [];
302
+ SharedService.ɵfac = function SharedService_Factory(t) { return new (t || SharedService)(i0.ɵɵinject(i1.NotificationService)); };
303
+ SharedService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: SharedService, factory: SharedService.ɵfac, providedIn: 'root' });
304
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SharedService, [{
305
+ type: Injectable,
306
+ args: [{
307
+ providedIn: 'root'
308
+ }]
309
+ }], () => [{ type: i1.NotificationService }], null); })();
310
+ export const HtmlListType = {
311
+ Unordered: 'Unordered',
312
+ Ordered: 'Ordered',
313
+ };
314
+ export const EventCodes = {
315
+ ViewClicked: "ViewClicked",
316
+ EntityRecordClicked: "EntityRecordClicked",
317
+ AddDashboard: "AddDashboard",
318
+ AddReport: "AddReport",
319
+ AddQuery: "AddQuery",
320
+ ViewCreated: "ViewCreated",
321
+ ViewUpdated: "ViewUpdated",
322
+ RunSearch: "RunSearch",
323
+ ViewNotifications: "ViewNotifications",
324
+ PushStatusUpdates: "PushStatusUpdates",
325
+ UserNotificationsUpdated: "UserNotificationsUpdated"
326
+ };
@@ -1,3 +1,5 @@
1
1
  export * from './lib/util';
2
2
  export * from './lib/urlPipe';
3
+ export * from './lib/shared.service';
4
+ export * from './lib/base-resource-component';
3
5
  export * from './module';
@@ -3,4 +3,6 @@
3
3
  */
4
4
  export * from './lib/util';
5
5
  export * from './lib/urlPipe';
6
+ export * from './lib/shared.service';
7
+ export * from './lib/base-resource-component';
6
8
  export * from './module';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-shared",
3
- "version": "0.9.3",
3
+ "version": "0.9.10",
4
4
  "description": "MemberJunction: Angular Shared Package - utility functions and other reusable elements used across other MJ Angular packages",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",