@memberjunction/ng-resource-permissions 5.30.0 → 5.31.0
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.
- package/dist/lib/mj-resource-permission-share-adapter.d.ts +9 -0
- package/dist/lib/mj-resource-permission-share-adapter.d.ts.map +1 -1
- package/dist/lib/mj-resource-permission-share-adapter.js +17 -5
- package/dist/lib/mj-resource-permission-share-adapter.js.map +1 -1
- package/dist/lib/user-sharing-center.component.d.ts +2 -1
- package/dist/lib/user-sharing-center.component.d.ts.map +1 -1
- package/dist/lib/user-sharing-center.component.js +9 -8
- package/dist/lib/user-sharing-center.component.js.map +1 -1
- package/package.json +10 -10
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { IMetadataProvider } from '@memberjunction/core';
|
|
1
2
|
import { MJUserEntity } from '@memberjunction/core-entities';
|
|
2
3
|
import { ResourceShareAdapter, ResourceShareContext, ResourceSharePermissionModel } from './resource-share-adapter';
|
|
3
4
|
/**
|
|
@@ -12,8 +13,16 @@ import { ResourceShareAdapter, ResourceShareContext, ResourceSharePermissionMode
|
|
|
12
13
|
* const adapter = new MJResourcePermissionShareAdapter(CONVERSATIONS_RESOURCE_TYPE_ID);
|
|
13
14
|
* ```
|
|
14
15
|
*/
|
|
16
|
+
/**
|
|
17
|
+
* Multi-provider note: callers running under a non-default `IMetadataProvider`
|
|
18
|
+
* (e.g. multi-server clients) should set `adapter.Provider = component.ProviderToUse`
|
|
19
|
+
* after construction so all metadata/RunView calls flow through the same provider.
|
|
20
|
+
*/
|
|
15
21
|
export declare class MJResourcePermissionShareAdapter implements ResourceShareAdapter {
|
|
16
22
|
private readonly resourceTypeId;
|
|
23
|
+
private _provider;
|
|
24
|
+
get Provider(): IMetadataProvider;
|
|
25
|
+
set Provider(value: IMetadataProvider | null);
|
|
17
26
|
constructor(resourceTypeId: string);
|
|
18
27
|
LoadShares(context: ResourceShareContext): Promise<ResourceSharePermissionModel[]>;
|
|
19
28
|
CreateShare(context: ResourceShareContext, user: MJUserEntity): Promise<ResourceSharePermissionModel>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mj-resource-permission-share-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/mj-resource-permission-share-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mj-resource-permission-share-adapter.d.ts","sourceRoot":"","sources":["../../src/lib/mj-resource-permission-share-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAqB,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAA8B,YAAY,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EACH,oBAAoB,EACpB,oBAAoB,EAEpB,4BAA4B,EAC/B,MAAM,0BAA0B,CAAC;AAElC;;;;;;;;;;;GAWG;AACH;;;;GAIG;AACH,qBAAa,gCAAiC,YAAW,oBAAoB;IAU7D,OAAO,CAAC,QAAQ,CAAC,cAAc;IAT3C,OAAO,CAAC,SAAS,CAAkC;IAEnD,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;IACD,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAElD;gBAE4B,cAAc,EAAE,MAAM;IAE7C,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,4BAA4B,EAAE,CAAC;IA6BlF,WAAW,CAAC,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,4BAA4B,CAAC;IAuB3G,iBAAiB,CAAC,GAAG,EAAE,4BAA4B,GAAG,IAAI;YAK5C,QAAQ;CAMzB"}
|
|
@@ -11,13 +11,25 @@ import { Metadata, RunView } from '@memberjunction/core';
|
|
|
11
11
|
* const adapter = new MJResourcePermissionShareAdapter(CONVERSATIONS_RESOURCE_TYPE_ID);
|
|
12
12
|
* ```
|
|
13
13
|
*/
|
|
14
|
+
/**
|
|
15
|
+
* Multi-provider note: callers running under a non-default `IMetadataProvider`
|
|
16
|
+
* (e.g. multi-server clients) should set `adapter.Provider = component.ProviderToUse`
|
|
17
|
+
* after construction so all metadata/RunView calls flow through the same provider.
|
|
18
|
+
*/
|
|
14
19
|
export class MJResourcePermissionShareAdapter {
|
|
15
20
|
resourceTypeId;
|
|
21
|
+
_provider = null;
|
|
22
|
+
get Provider() {
|
|
23
|
+
return this._provider ?? Metadata.Provider;
|
|
24
|
+
}
|
|
25
|
+
set Provider(value) {
|
|
26
|
+
this._provider = value;
|
|
27
|
+
}
|
|
16
28
|
constructor(resourceTypeId) {
|
|
17
29
|
this.resourceTypeId = resourceTypeId;
|
|
18
30
|
}
|
|
19
31
|
async LoadShares(context) {
|
|
20
|
-
const rv =
|
|
32
|
+
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
21
33
|
const result = await rv.RunView({
|
|
22
34
|
EntityName: 'MJ: Resource Permissions',
|
|
23
35
|
ExtraFilter: `ResourceTypeID='${this.resourceTypeId}' ` +
|
|
@@ -46,8 +58,8 @@ export class MJResourcePermissionShareAdapter {
|
|
|
46
58
|
return rows;
|
|
47
59
|
}
|
|
48
60
|
async CreateShare(context, user) {
|
|
49
|
-
const md =
|
|
50
|
-
const perm = await md.GetEntityObject('MJ: Resource Permissions');
|
|
61
|
+
const md = this.Provider;
|
|
62
|
+
const perm = await md.GetEntityObject('MJ: Resource Permissions', md.CurrentUser);
|
|
51
63
|
perm.NewRecord();
|
|
52
64
|
perm.ResourceTypeID = this.resourceTypeId;
|
|
53
65
|
perm.ResourceRecordID = context.ResourceID;
|
|
@@ -72,8 +84,8 @@ export class MJResourcePermissionShareAdapter {
|
|
|
72
84
|
perm.PermissionLevel = row.Level;
|
|
73
85
|
}
|
|
74
86
|
async loadUser(userId) {
|
|
75
|
-
const md =
|
|
76
|
-
const user = await md.GetEntityObject('MJ: Users');
|
|
87
|
+
const md = this.Provider;
|
|
88
|
+
const user = await md.GetEntityObject('MJ: Users', md.CurrentUser);
|
|
77
89
|
const loaded = await user.Load(userId);
|
|
78
90
|
return loaded ? user : null;
|
|
79
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mj-resource-permission-share-adapter.js","sourceRoot":"","sources":["../../src/lib/mj-resource-permission-share-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"mj-resource-permission-share-adapter.js","sourceRoot":"","sources":["../../src/lib/mj-resource-permission-share-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["import { IMetadataProvider, Metadata, RunView } from '@memberjunction/core';\nimport { MJResourcePermissionEntity, MJUserEntity } from '@memberjunction/core-entities';\nimport {\n ResourceShareAdapter,\n ResourceShareContext,\n ResourceShareLevel,\n ResourceSharePermissionModel\n} from './resource-share-adapter';\n\n/**\n * Generic share adapter for any resource whose permissions live in the\n * polymorphic `MJ: Resource Permissions` table (Conversations, Reports, Queries,\n * and anything else seeded in the `MJ: Resource Types` catalog). The entity's\n * `PermissionLevel` column is already a 3-value enum, so the mapping is trivial\n * — `Level` is set and read directly with no translation.\n *\n * Construct with the target `ResourceTypeID`:\n * ```ts\n * const adapter = new MJResourcePermissionShareAdapter(CONVERSATIONS_RESOURCE_TYPE_ID);\n * ```\n */\n/**\n * Multi-provider note: callers running under a non-default `IMetadataProvider`\n * (e.g. multi-server clients) should set `adapter.Provider = component.ProviderToUse`\n * after construction so all metadata/RunView calls flow through the same provider.\n */\nexport class MJResourcePermissionShareAdapter implements ResourceShareAdapter {\n private _provider: IMetadataProvider | null = null;\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n constructor(private readonly resourceTypeId: string) {}\n\n async LoadShares(context: ResourceShareContext): Promise<ResourceSharePermissionModel[]> {\n const rv = RunView.FromMetadataProvider(this.Provider);\n const result = await rv.RunView<MJResourcePermissionEntity>({\n EntityName: 'MJ: Resource Permissions',\n ExtraFilter:\n `ResourceTypeID='${this.resourceTypeId}' ` +\n `AND ResourceRecordID='${context.ResourceID}' ` +\n `AND Type='User' AND Status='Approved'`,\n ResultType: 'entity_object'\n });\n if (!result.Success) return [];\n\n const rows: ResourceSharePermissionModel[] = [];\n for (const perm of result.Results) {\n if (!perm.UserID) continue;\n const user = await this.loadUser(perm.UserID);\n if (!user) continue;\n rows.push({\n PermissionEntity: perm,\n UserID: perm.UserID,\n User: user,\n Level: (perm.PermissionLevel as ResourceShareLevel | null) ?? 'View',\n IsNew: false,\n MarkedForRemoval: false\n });\n }\n return rows;\n }\n\n async CreateShare(context: ResourceShareContext, user: MJUserEntity): Promise<ResourceSharePermissionModel> {\n const md = this.Provider;\n const perm = await md.GetEntityObject<MJResourcePermissionEntity>('MJ: Resource Permissions', md.CurrentUser);\n perm.NewRecord();\n perm.ResourceTypeID = this.resourceTypeId;\n perm.ResourceRecordID = context.ResourceID;\n perm.Type = 'User';\n perm.UserID = user.ID;\n perm.PermissionLevel = 'View';\n perm.Status = 'Approved';\n if (context.CurrentUserID) {\n perm.SharedByUserID = context.CurrentUserID;\n }\n return {\n PermissionEntity: perm,\n UserID: user.ID,\n User: user,\n Level: 'View',\n IsNew: true,\n MarkedForRemoval: false\n };\n }\n\n SyncLevelToEntity(row: ResourceSharePermissionModel): void {\n const perm = row.PermissionEntity as MJResourcePermissionEntity;\n perm.PermissionLevel = row.Level;\n }\n\n private async loadUser(userId: string): Promise<MJUserEntity | null> {\n const md = this.Provider;\n const user = await md.GetEntityObject<MJUserEntity>('MJ: Users', md.CurrentUser);\n const loaded = await user.Load(userId);\n return loaded ? user : null;\n }\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
2
|
import { NormalizedPermission, PermissionAction } from '@memberjunction/core';
|
|
3
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
/** Which tab the Sharing Center is currently displaying. */
|
|
5
6
|
export type SharingCenterTab = 'shared-with-me' | 'shared-by-me';
|
|
@@ -47,7 +48,7 @@ export declare const DefaultSharingEntityResolver: (domainName: string) => strin
|
|
|
47
48
|
* </mj-user-sharing-center>
|
|
48
49
|
* ```
|
|
49
50
|
*/
|
|
50
|
-
export declare class UserSharingCenterComponent implements OnInit {
|
|
51
|
+
export declare class UserSharingCenterComponent extends BaseAngularComponent implements OnInit {
|
|
51
52
|
private readonly cdr;
|
|
52
53
|
private readonly dialogService;
|
|
53
54
|
/** Which tab is shown initially. Two-way bindable via `ActiveTabChange`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-sharing-center.component.d.ts","sourceRoot":"","sources":["../../src/lib/user-sharing-center.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,YAAY,EAEZ,MAAM,EAGT,MAAM,eAAe,CAAC;AAEvB,OAAO,
|
|
1
|
+
{"version":3,"file":"user-sharing-center.component.d.ts","sourceRoot":"","sources":["../../src/lib/user-sharing-center.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,YAAY,EAEZ,MAAM,EAGT,MAAM,eAAe,CAAC;AAEvB,OAAO,EAIH,oBAAoB,EACpB,gBAAgB,EACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AAErE,4DAA4D;AAC5D,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,cAAc,CAAC;AAEjE;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,oBAAoB,EAAE,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,GAAI,YAAY,MAAM,KAAG,MAAM,GAAG,IAe1E,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAQa,0BAA2B,SAAQ,oBAAqB,YAAW,MAAM;IAClF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;IAIzD,4EAA4E;IACnE,SAAS,EAAE,gBAAgB,CAAoB;IAExD;;;OAGG;IACM,eAAe,UAAQ;IAEhC,yDAAyD;IAChD,kBAAkB,SAAmB;IAE9C;;;;OAIG;IACM,qBAAqB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAgC;IAIrG,+CAA+C;IACrC,eAAe,iCAAwC;IAEjE,+DAA+D;IACrD,eAAe,qCAA4C;IAErE,8FAA8F;IACpF,cAAc,qBAA4B;IAEpD,8DAA8D;IACpD,iBAAiB,qCAA4C;IAEvE,iFAAiF;IACvE,aAAa,uBAA8B;IAIrD,YAAY,EAAE,wBAAwB,EAAE,CAAM;IAC9C,UAAU,EAAE,wBAAwB,EAAE,CAAM;IAE5C,eAAe,UAAS;IACxB,aAAa,UAAS;IAEtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE7B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,+DAA+D;IAClD,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5D,8CAA8C;IACjC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAYrC,UAAU,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,UAAU,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI;IAI3C,OAAO,IAAI,IAAI;IAIT,QAAQ,CAAC,GAAG,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCtE,WAAW,CAAC,KAAK,EAAE,wBAAwB,GAAG,IAAI;IAKlD,YAAY,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM;IAIjD,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,wBAAwB,GAAG,MAAM;IAIhE,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,oBAAoB,GAAG,MAAM;YAM3C,OAAO;YAYP,gBAAgB;YAiBhB,cAAc;IAiB5B,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,aAAa;yCAtNZ,0BAA0B;2CAA1B,0BAA0B;CA6OtC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, inject, } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { CompositeKey, LogError,
|
|
3
|
+
import { CompositeKey, LogError, } from '@memberjunction/core';
|
|
4
4
|
import { PermissionEngine } from '@memberjunction/core-entities';
|
|
5
5
|
import { MJDialogService } from '@memberjunction/ng-ui-components';
|
|
6
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
import * as i1 from "@angular/common";
|
|
8
9
|
function UserSharingCenterComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -273,7 +274,7 @@ export const DefaultSharingEntityResolver = (domainName) => {
|
|
|
273
274
|
* </mj-user-sharing-center>
|
|
274
275
|
* ```
|
|
275
276
|
*/
|
|
276
|
-
export class UserSharingCenterComponent {
|
|
277
|
+
export class UserSharingCenterComponent extends BaseAngularComponent {
|
|
277
278
|
cdr = inject(ChangeDetectorRef);
|
|
278
279
|
dialogService = inject(MJDialogService);
|
|
279
280
|
// ─── Inputs ────────────────────────────────────────────────────────────────
|
|
@@ -353,8 +354,8 @@ export class UserSharingCenterComponent {
|
|
|
353
354
|
if (!confirmed)
|
|
354
355
|
return;
|
|
355
356
|
try {
|
|
356
|
-
const md =
|
|
357
|
-
const entity = await md.GetEntityObject(entityName);
|
|
357
|
+
const md = this.ProviderToUse;
|
|
358
|
+
const entity = await md.GetEntityObject(entityName, md.CurrentUser);
|
|
358
359
|
const key = new CompositeKey();
|
|
359
360
|
key.KeyValuePairs.push({ FieldName: 'ID', Value: row.SourceRecordID });
|
|
360
361
|
const loaded = await entity.InnerLoad(key);
|
|
@@ -401,7 +402,7 @@ export class UserSharingCenterComponent {
|
|
|
401
402
|
}
|
|
402
403
|
}
|
|
403
404
|
async loadSharedWithMe() {
|
|
404
|
-
const user =
|
|
405
|
+
const user = this.ProviderToUse.CurrentUser;
|
|
405
406
|
if (!user)
|
|
406
407
|
return;
|
|
407
408
|
this.IsLoadingWithMe = true;
|
|
@@ -418,7 +419,7 @@ export class UserSharingCenterComponent {
|
|
|
418
419
|
this.cdr.detectChanges();
|
|
419
420
|
}
|
|
420
421
|
async loadSharedByMe() {
|
|
421
|
-
const user =
|
|
422
|
+
const user = this.ProviderToUse.CurrentUser;
|
|
422
423
|
if (!user)
|
|
423
424
|
return;
|
|
424
425
|
this.IsLoadingByMe = true;
|
|
@@ -479,8 +480,8 @@ export class UserSharingCenterComponent {
|
|
|
479
480
|
});
|
|
480
481
|
});
|
|
481
482
|
}
|
|
482
|
-
static ɵfac = function UserSharingCenterComponent_Factory(__ngFactoryType__) { return
|
|
483
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserSharingCenterComponent, selectors: [["mj-user-sharing-center"]], inputs: { ActiveTab: "ActiveTab", ShowCloseButton: "ShowCloseButton", RevokeConfirmTitle: "RevokeConfirmTitle", SharingEntityResolver: "SharingEntityResolver" }, outputs: { ActiveTabChange: "ActiveTabChange", ResourceClicked: "ResourceClicked", CloseRequested: "CloseRequested", PermissionRevoked: "PermissionRevoked", ErrorOccurred: "ErrorOccurred" }, decls: 13, vars: 7, consts: [[1, "user-sharing-center"], [1, "tabs"], [1, "tab", 3, "click"], [1, "fa-solid", "fa-inbox"], [1, "fa-solid", "fa-paper-plane"], [1, "spacer"], ["title", "Close", 1, "close"], [1, "error"], ["title", "Close", 1, "close", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "loading"], [1, "empty"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "group"], [1, "group-header", 3, "click"], [1, "group-name"], [1, "count"], [1, "fa-solid", "chevron"], [1, "rows"], [1, "row"], [1, "row", 3, "click"], [1, "resource"], [1, "resource-type"], [1, "actions"], [1, "expires"], [1, "row", "editable"], [1, "grantee"], [1, "fa-solid", "fa-user"], ["title", "Revoke access", 1, "revoke", 3, "click"], [1, "fa-solid", "fa-trash"]], template: function UserSharingCenterComponent_Template(rf, ctx) { if (rf & 1) {
|
|
483
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵUserSharingCenterComponent_BaseFactory; return function UserSharingCenterComponent_Factory(__ngFactoryType__) { return (ɵUserSharingCenterComponent_BaseFactory || (ɵUserSharingCenterComponent_BaseFactory = i0.ɵɵgetInheritedFactory(UserSharingCenterComponent)))(__ngFactoryType__ || UserSharingCenterComponent); }; })();
|
|
484
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: UserSharingCenterComponent, selectors: [["mj-user-sharing-center"]], inputs: { ActiveTab: "ActiveTab", ShowCloseButton: "ShowCloseButton", RevokeConfirmTitle: "RevokeConfirmTitle", SharingEntityResolver: "SharingEntityResolver" }, outputs: { ActiveTabChange: "ActiveTabChange", ResourceClicked: "ResourceClicked", CloseRequested: "CloseRequested", PermissionRevoked: "PermissionRevoked", ErrorOccurred: "ErrorOccurred" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 13, vars: 7, consts: [[1, "user-sharing-center"], [1, "tabs"], [1, "tab", 3, "click"], [1, "fa-solid", "fa-inbox"], [1, "fa-solid", "fa-paper-plane"], [1, "spacer"], ["title", "Close", 1, "close"], [1, "error"], ["title", "Close", 1, "close", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "fa-solid", "fa-triangle-exclamation"], [1, "loading"], [1, "empty"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "group"], [1, "group-header", 3, "click"], [1, "group-name"], [1, "count"], [1, "fa-solid", "chevron"], [1, "rows"], [1, "row"], [1, "row", 3, "click"], [1, "resource"], [1, "resource-type"], [1, "actions"], [1, "expires"], [1, "row", "editable"], [1, "grantee"], [1, "fa-solid", "fa-user"], ["title", "Revoke access", 1, "revoke", 3, "click"], [1, "fa-solid", "fa-trash"]], template: function UserSharingCenterComponent_Template(rf, ctx) { if (rf & 1) {
|
|
484
485
|
i0.ɵɵdomElementStart(0, "div", 0)(1, "div", 1)(2, "button", 2);
|
|
485
486
|
i0.ɵɵdomListener("click", function UserSharingCenterComponent_Template_button_click_2_listener() { return ctx.OnTabClick("shared-with-me"); });
|
|
486
487
|
i0.ɵɵdomElement(3, "i", 3);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-sharing-center.component.js","sourceRoot":"","sources":["../../src/lib/user-sharing-center.component.ts","../../src/lib/user-sharing-center.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n BaseEntity,\n CompositeKey,\n LogError,\n Metadata,\n NormalizedPermission,\n PermissionAction,\n} from '@memberjunction/core';\nimport { PermissionEngine } from '@memberjunction/core-entities';\nimport { MJDialogAction, MJDialogService } from '@memberjunction/ng-ui-components';\n\n/** Which tab the Sharing Center is currently displaying. */\nexport type SharingCenterTab = 'shared-with-me' | 'shared-by-me';\n\n/**\n * One collapsible domain section rendered by {@link UserSharingCenterComponent}.\n * Exported because consumers occasionally want to render their own custom layout\n * around the same shape.\n */\nexport interface SharingCenterDomainGroup {\n DomainName: string;\n Icon: string;\n Rows: NormalizedPermission[];\n Expanded: boolean;\n}\n\n/**\n * Default domain → entity-name mapping used by the Sharing Center to load and\n * delete the underlying permission record on Revoke. Apps with custom permission\n * domains can pass a replacement function via `SharingEntityResolver`.\n */\nexport const DefaultSharingEntityResolver = (domainName: string): string | null => {\n switch (domainName) {\n case 'Dashboard Permissions':\n return 'MJ: Dashboard Permissions';\n case 'Artifact Permissions':\n return 'MJ: Artifact Permissions';\n case 'Collection Permissions':\n return 'MJ: Collection Permissions';\n case 'Access Control Rules':\n return 'MJ: Access Control Rules';\n case 'Resource Permissions':\n return 'MJ: Resource Permissions';\n default:\n return null;\n }\n};\n\n/**\n * **Generic, framework-agnostic Sharing Center.** Renders two tabs:\n *\n * - **Shared with me** — every resource the current user has direct (non-role)\n * access to, grouped by permission domain. Each row is clickable and emits\n * `ResourceClicked` so the embedding app can route to the resource. The Generic\n * component never imports Angular Router / NavigationService — the parent\n * decides how to navigate.\n *\n * - **Shared by me** — every permission record where the current user is the\n * grantor. Each row has a Revoke button that deletes the underlying permission\n * record through `Metadata.GetEntityObject().Delete()` (so audit captures the\n * revoke and BaseEntity event-driven cache invalidation runs).\n *\n * Inputs / Outputs are designed so the component drops cleanly into a dialog,\n * a side panel, an embedded widget, or a full-page route.\n *\n * @example\n * ```html\n * <mj-user-sharing-center\n * [ActiveTab]=\"tab\"\n * (ActiveTabChange)=\"tab = $event\"\n * (ResourceClicked)=\"OnResourceClicked($event)\"\n * (CloseRequested)=\"dialogRef.Close()\">\n * </mj-user-sharing-center>\n * ```\n */\n@Component({\n standalone: true,\n selector: 'mj-user-sharing-center',\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './user-sharing-center.component.html',\n styleUrls: ['./user-sharing-center.component.css'],\n})\nexport class UserSharingCenterComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly dialogService = inject(MJDialogService);\n\n // ─── Inputs ────────────────────────────────────────────────────────────────\n\n /** Which tab is shown initially. Two-way bindable via `ActiveTabChange`. */\n @Input() ActiveTab: SharingCenterTab = 'shared-with-me';\n\n /**\n * When true, the close button is rendered in the tab strip. Hide it when the\n * embedding container provides its own close affordance.\n */\n @Input() ShowCloseButton = true;\n\n /** Title text displayed in the confirm-revoke dialog. */\n @Input() RevokeConfirmTitle = 'Revoke access';\n\n /**\n * Maps a permission domain name (e.g. `\"Dashboard Permissions\"`) to the entity\n * name used to load and delete the underlying record on Revoke. Replace to add\n * support for custom domains. Defaults to {@link DefaultSharingEntityResolver}.\n */\n @Input() SharingEntityResolver: (domainName: string) => string | null = DefaultSharingEntityResolver;\n\n // ─── Outputs ───────────────────────────────────────────────────────────────\n\n /** Two-way binding partner for `ActiveTab`. */\n @Output() ActiveTabChange = new EventEmitter<SharingCenterTab>();\n\n /** Fired when a row in the \"Shared with me\" tab is clicked. */\n @Output() ResourceClicked = new EventEmitter<NormalizedPermission>();\n\n /** Fired when the user clicks the close button. Parent should close the host dialog/panel. */\n @Output() CloseRequested = new EventEmitter<void>();\n\n /** Fired after a permission has been successfully revoked. */\n @Output() PermissionRevoked = new EventEmitter<NormalizedPermission>();\n\n /** Fired whenever an error is shown to the user. Useful for parent telemetry. */\n @Output() ErrorOccurred = new EventEmitter<string>();\n\n // ─── Public state (read by template) ───────────────────────────────────────\n\n SharedWithMe: SharingCenterDomainGroup[] = [];\n SharedByMe: SharingCenterDomainGroup[] = [];\n\n IsLoadingWithMe = false;\n IsLoadingByMe = false;\n\n ErrorMessage: string | null = null;\n\n async ngOnInit(): Promise<void> {\n await this.loadTab(this.ActiveTab);\n }\n\n // ─── Public methods (callable from parent via @ViewChild) ──────────────────\n\n /** Switch to a tab and load its data if not already loaded. */\n public async SwitchTab(tab: SharingCenterTab): Promise<void> {\n if (this.ActiveTab === tab) return;\n this.ActiveTab = tab;\n this.ActiveTabChange.emit(tab);\n await this.loadTab(tab);\n }\n\n /** Force-refresh the currently active tab. */\n public async Refresh(): Promise<void> {\n if (this.ActiveTab === 'shared-with-me') {\n this.SharedWithMe = [];\n await this.loadSharedWithMe();\n } else {\n this.SharedByMe = [];\n await this.loadSharedByMe();\n }\n }\n\n // ─── Template event handlers ───────────────────────────────────────────────\n\n OnTabClick(tab: SharingCenterTab): Promise<void> {\n return this.SwitchTab(tab);\n }\n\n OnRowClick(row: NormalizedPermission): void {\n this.ResourceClicked.emit(row);\n }\n\n OnClose(): void {\n this.CloseRequested.emit();\n }\n\n async OnRevoke(row: NormalizedPermission, event: Event): Promise<void> {\n event.stopPropagation();\n if (!row.SourceRecordID) return;\n\n const entityName = this.SharingEntityResolver(row.DomainName);\n if (!entityName) return;\n\n const confirmed = await this.confirmRevoke(row);\n if (!confirmed) return;\n\n try {\n const md = new Metadata();\n const entity = await md.GetEntityObject<BaseEntity>(entityName);\n const key = new CompositeKey();\n key.KeyValuePairs.push({ FieldName: 'ID', Value: row.SourceRecordID });\n const loaded = await entity.InnerLoad(key);\n if (!loaded) {\n this.setError('Could not load the permission record.');\n return;\n }\n const deleted = await entity.Delete();\n if (!deleted) {\n this.setError(`Revoke failed: ${entity.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return;\n }\n this.PermissionRevoked.emit(row);\n await this.Refresh();\n } catch (e) {\n this.setError(`Revoke failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n ToggleGroup(group: SharingCenterDomainGroup): void {\n group.Expanded = !group.Expanded;\n this.cdr.detectChanges();\n }\n\n ActionsLabel(actions: PermissionAction[]): string {\n return actions.join(', ');\n }\n\n TrackByDomain(_idx: number, g: SharingCenterDomainGroup): string {\n return g.DomainName;\n }\n\n TrackByRow(_idx: number, r: NormalizedPermission): string {\n return r.SourceRecordID ?? `${r.DomainName}|${r.ResourceID ?? ''}|${r.GranteeID ?? ''}`;\n }\n\n // ─── Internal helpers ──────────────────────────────────────────────────────\n\n private async loadTab(tab: SharingCenterTab): Promise<void> {\n if (tab === 'shared-with-me') {\n if (this.SharedWithMe.length === 0 && !this.IsLoadingWithMe) {\n await this.loadSharedWithMe();\n }\n } else {\n if (this.SharedByMe.length === 0 && !this.IsLoadingByMe) {\n await this.loadSharedByMe();\n }\n }\n }\n\n private async loadSharedWithMe(): Promise<void> {\n const user = new Metadata().CurrentUser;\n if (!user) return;\n\n this.IsLoadingWithMe = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n try {\n const rows = await PermissionEngine.Instance.GetPermissionsSharedWithUser(user);\n this.SharedWithMe = this.groupByDomain(rows);\n } catch (e) {\n this.setError(`Failed to load shares: ${e instanceof Error ? e.message : String(e)}`);\n }\n this.IsLoadingWithMe = false;\n this.cdr.detectChanges();\n }\n\n private async loadSharedByMe(): Promise<void> {\n const user = new Metadata().CurrentUser;\n if (!user) return;\n\n this.IsLoadingByMe = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n try {\n const rows = await PermissionEngine.Instance.GetPermissionsGrantedByUser(user);\n this.SharedByMe = this.groupByDomain(rows);\n } catch (e) {\n this.setError(`Failed to load grants: ${e instanceof Error ? e.message : String(e)}`);\n }\n this.IsLoadingByMe = false;\n this.cdr.detectChanges();\n }\n\n private groupByDomain(rows: NormalizedPermission[]): SharingCenterDomainGroup[] {\n const bucket = new Map<string, NormalizedPermission[]>();\n for (const r of rows) {\n const list = bucket.get(r.DomainName) ?? [];\n list.push(r);\n bucket.set(r.DomainName, list);\n }\n const groups: SharingCenterDomainGroup[] = [];\n for (const [domainName, list] of bucket) {\n groups.push({\n DomainName: domainName,\n Icon: PermissionEngine.DomainIconFor(domainName),\n Rows: list.sort((a, b) => (a.ResourceName ?? '').localeCompare(b.ResourceName ?? '')),\n Expanded: list.length <= 10,\n });\n }\n return groups.sort((a, b) => a.DomainName.localeCompare(b.DomainName));\n }\n\n private setError(message: string): void {\n this.ErrorMessage = message;\n this.ErrorOccurred.emit(message);\n LogError(message);\n this.cdr.detectChanges();\n }\n\n private confirmRevoke(row: NormalizedPermission): Promise<boolean> {\n const resourceLabel = row.ResourceName ? `\"${row.ResourceName}\"` : 'this resource';\n const granteeLabel = row.GranteeName ?? 'this user';\n const message = `Revoke access to ${resourceLabel} for ${granteeLabel}? This cannot be undone.`;\n\n return new Promise<boolean>((resolve) => {\n const ref = this.dialogService.open({\n title: this.RevokeConfirmTitle,\n content: message,\n actions: [\n { text: 'Revoke', primary: true, themeColor: 'error' },\n { text: 'Cancel', primary: false },\n ],\n width: 420,\n minWidth: 300,\n });\n\n ref.Result.subscribe((result) => {\n const action = result as MJDialogAction | undefined;\n resolve(!!action && 'text' in action && action.text === 'Revoke');\n });\n });\n }\n}\n","<div class=\"user-sharing-center\">\n <div class=\"tabs\">\n <button\n class=\"tab\"\n [class.active]=\"ActiveTab === 'shared-with-me'\"\n (click)=\"OnTabClick('shared-with-me')\">\n <i class=\"fa-solid fa-inbox\"></i>\n Shared with me\n </button>\n <button\n class=\"tab\"\n [class.active]=\"ActiveTab === 'shared-by-me'\"\n (click)=\"OnTabClick('shared-by-me')\">\n <i class=\"fa-solid fa-paper-plane\"></i>\n Shared by me\n </button>\n <div class=\"spacer\"></div>\n @if (ShowCloseButton) {\n <button class=\"close\" (click)=\"OnClose()\" title=\"Close\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n\n @if (ErrorMessage) {\n <div class=\"error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n {{ ErrorMessage }}\n </div>\n }\n\n @if (ActiveTab === 'shared-with-me') {\n @if (IsLoadingWithMe) {\n <div class=\"loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading…\n </div>\n } @else if (SharedWithMe.length === 0) {\n <div class=\"empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n Nothing has been shared directly with you yet.\n </div>\n } @else {\n @for (group of SharedWithMe; track TrackByDomain($index, group)) {\n <div class=\"group\">\n <button class=\"group-header\" (click)=\"ToggleGroup(group)\">\n <i [class]=\"group.Icon\"></i>\n <span class=\"group-name\">{{ group.DomainName }}</span>\n <span class=\"count\">{{ group.Rows.length }}</span>\n <i class=\"fa-solid chevron\" [class.fa-chevron-down]=\"group.Expanded\" [class.fa-chevron-right]=\"!group.Expanded\"></i>\n </button>\n @if (group.Expanded) {\n <div class=\"rows\">\n @for (row of group.Rows; track TrackByRow($index, row)) {\n <button class=\"row\" (click)=\"OnRowClick(row)\">\n <span class=\"resource\">{{ row.ResourceName || row.ResourceID }}</span>\n <span class=\"resource-type\">{{ row.ResourceType }}</span>\n <span class=\"actions\">{{ ActionsLabel(row.Actions) }}</span>\n @if (row.ExpiresAt) {\n <span class=\"expires\">expires {{ row.ExpiresAt | date:'mediumDate' }}</span>\n }\n </button>\n }\n </div>\n }\n </div>\n }\n }\n } @else {\n @if (IsLoadingByMe) {\n <div class=\"loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading…\n </div>\n } @else if (SharedByMe.length === 0) {\n <div class=\"empty\">\n <i class=\"fa-solid fa-paper-plane\"></i>\n You haven't shared anything with others yet.\n </div>\n } @else {\n @for (group of SharedByMe; track TrackByDomain($index, group)) {\n <div class=\"group\">\n <button class=\"group-header\" (click)=\"ToggleGroup(group)\">\n <i [class]=\"group.Icon\"></i>\n <span class=\"group-name\">{{ group.DomainName }}</span>\n <span class=\"count\">{{ group.Rows.length }}</span>\n <i class=\"fa-solid chevron\" [class.fa-chevron-down]=\"group.Expanded\" [class.fa-chevron-right]=\"!group.Expanded\"></i>\n </button>\n @if (group.Expanded) {\n <div class=\"rows\">\n @for (row of group.Rows; track TrackByRow($index, row)) {\n <div class=\"row editable\">\n <span class=\"resource\">{{ row.ResourceName || row.ResourceID }}</span>\n <span class=\"resource-type\">{{ row.ResourceType }}</span>\n <span class=\"grantee\">\n <i class=\"fa-solid fa-user\"></i>\n {{ row.GranteeName || row.GranteeType }}\n </span>\n <span class=\"actions\">{{ ActionsLabel(row.Actions) }}</span>\n @if (row.ExpiresAt) {\n <span class=\"expires\">expires {{ row.ExpiresAt | date:'mediumDate' }}</span>\n }\n <button class=\"revoke\" (click)=\"OnRevoke(row, $event)\" title=\"Revoke access\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n }\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"user-sharing-center.component.js","sourceRoot":"","sources":["../../src/lib/user-sharing-center.component.ts","../../src/lib/user-sharing-center.component.html"],"names":[],"mappings":"AAAA,OAAO,EACH,uBAAuB,EACvB,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,KAAK,EAEL,MAAM,EACN,MAAM,GACT,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAEH,YAAY,EACZ,QAAQ,GAGX,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAkB,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;;;;ICFzD,oCAAwD;IAAlC,iMAAS,gBAAS,KAAC;IACrC,0BAAiC;IACrC,oBAAS;;;IAKb,iCAAmB;IACf,2BAAgD;IAChD,YACJ;IAAA,oBAAM;;;IADF,eACJ;IADI,oDACJ;;;IAKI,kCAAqB;IACjB,2BAA2C;IAC3C,+BACJ;IAAA,oBAAM;;;IAEN,kCAAmB;IACf,0BAAiC;IACjC,gEACJ;IAAA,oBAAM;;;IAkBsB,mCAAsB;IAAA,YAA+C;;IAAA,oBAAO;;;IAAtD,cAA+C;IAA/C,uFAA+C;;;;IAL7E,qCAA8C;IAA1B,oQAAS,yBAAe,KAAC;IACzC,mCAAuB;IAAA,YAAwC;IAAA,oBAAO;IACtE,mCAA4B;IAAA,YAAsB;IAAA,oBAAO;IACzD,mCAAsB;IAAA,YAA+B;IAAA,oBAAO;IAC5D,qJAAqB;IAGzB,oBAAS;;;;IANkB,eAAwC;IAAxC,8DAAwC;IACnC,eAAsB;IAAtB,yCAAsB;IAC5B,eAA+B;IAA/B,yDAA+B;IACrD,cAEC;IAFD,2CAEC;;;IARb,kCAAkB;IACd,iLASC;IACL,oBAAM;;;IAVF,cASC;IATD,4BASC;;;;IAjBT,AADJ,kCAAmB,iBAC2C;IAA7B,kPAAS,4BAAkB,KAAC;IACrD,uBAA4B;IAC5B,mCAAyB;IAAA,YAAsB;IAAA,oBAAO;IACtD,mCAAoB;IAAA,YAAuB;IAAA,oBAAO;IAClD,2BAAoH;IACxH,oBAAS;IACT,gIAAsB;IAc1B,oBAAM;;;IAnBK,eAAoB;IAApB,4BAAoB;IACE,eAAsB;IAAtB,yCAAsB;IAC3B,eAAuB;IAAvB,0CAAuB;IACf,cAAwC;IAAC,AAAzC,oDAAwC,wCAA2C;IAEnH,cAaC;IAbD,4CAaC;;;IArBT,6JAuBC;;;IAvBD,kCAuBC;;;IAxBH,AALA,AALF,4GAAuB,sFAKiB,2EAK/B;;;IAVT,uFAmCC;;;IAGG,kCAAqB;IACjB,2BAA2C;IAC3C,+BACJ;IAAA,oBAAM;;;IAEN,kCAAmB;IACf,0BAAuC;IACvC,8DACJ;IAAA,oBAAM;;;IAsBsB,mCAAsB;IAAA,YAA+C;;IAAA,oBAAO;;;IAAtD,cAA+C;IAA/C,wFAA+C;;;;IARzE,AADJ,kCAA0B,eACC;IAAA,YAAwC;IAAA,oBAAO;IACtE,mCAA4B;IAAA,YAAsB;IAAA,oBAAO;IACzD,mCAAsB;IAClB,2BAAgC;IAChC,YACJ;IAAA,oBAAO;IACP,mCAAsB;IAAA,YAA+B;IAAA,oBAAO;IAC5D,uJAAqB;IAGrB,sCAA6E;IAAtD,4QAAS,gCAAqB,KAAC;IAClD,4BAAiC;IAEzC,AADI,oBAAS,EACP;;;;IAbqB,eAAwC;IAAxC,gEAAwC;IACnC,eAAsB;IAAtB,0CAAsB;IAG9C,eACJ;IADI,2EACJ;IACsB,eAA+B;IAA/B,0DAA+B;IACrD,cAEC;IAFD,6CAEC;;;IAZb,kCAAkB;IACd,+KAgBC;IACL,oBAAM;;;IAjBF,cAgBC;IAhBD,4BAgBC;;;;IAxBT,AADJ,kCAAmB,iBAC2C;IAA7B,kPAAS,4BAAkB,KAAC;IACrD,uBAA4B;IAC5B,mCAAyB;IAAA,YAAsB;IAAA,oBAAO;IACtD,mCAAoB;IAAA,YAAuB;IAAA,oBAAO;IAClD,2BAAoH;IACxH,oBAAS;IACT,gIAAsB;IAqB1B,oBAAM;;;IA1BK,eAAoB;IAApB,4BAAoB;IACE,eAAsB;IAAtB,yCAAsB;IAC3B,eAAuB;IAAvB,0CAAuB;IACf,cAAwC;IAAC,AAAzC,oDAAwC,wCAA2C;IAEnH,cAoBC;IApBD,4CAoBC;;;IA5BT,6JA8BC;;;IA9BD,gCA8BC;;;IA/BH,AALA,AALF,4GAAqB,sFAKiB,2EAK7B;;;IAVT,mFA0CC;;AD1ET;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,UAAkB,EAAiB,EAAE;IAC9E,QAAQ,UAAU,EAAE,CAAC;QACjB,KAAK,uBAAuB;YACxB,OAAO,2BAA2B,CAAC;QACvC,KAAK,sBAAsB;YACvB,OAAO,0BAA0B,CAAC;QACtC,KAAK,wBAAwB;YACzB,OAAO,4BAA4B,CAAC;QACxC,KAAK,sBAAsB;YACvB,OAAO,0BAA0B,CAAC;QACtC,KAAK,sBAAsB;YACvB,OAAO,0BAA0B,CAAC;QACtC;YACI,OAAO,IAAI,CAAC;IACpB,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AASH,MAAM,OAAO,0BAA2B,SAAQ,oBAAoB;IAC/C,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChC,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;IAEzD,8EAA8E;IAE9E,4EAA4E;IACnE,SAAS,GAAqB,gBAAgB,CAAC;IAExD;;;OAGG;IACM,eAAe,GAAG,IAAI,CAAC;IAEhC,yDAAyD;IAChD,kBAAkB,GAAG,eAAe,CAAC;IAE9C;;;;OAIG;IACM,qBAAqB,GAA0C,4BAA4B,CAAC;IAErG,8EAA8E;IAE9E,+CAA+C;IACrC,eAAe,GAAG,IAAI,YAAY,EAAoB,CAAC;IAEjE,+DAA+D;IACrD,eAAe,GAAG,IAAI,YAAY,EAAwB,CAAC;IAErE,8FAA8F;IACpF,cAAc,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEpD,8DAA8D;IACpD,iBAAiB,GAAG,IAAI,YAAY,EAAwB,CAAC;IAEvE,iFAAiF;IACvE,aAAa,GAAG,IAAI,YAAY,EAAU,CAAC;IAErD,8EAA8E;IAE9E,YAAY,GAA+B,EAAE,CAAC;IAC9C,UAAU,GAA+B,EAAE,CAAC;IAE5C,eAAe,GAAG,KAAK,CAAC;IACxB,aAAa,GAAG,KAAK,CAAC;IAEtB,YAAY,GAAkB,IAAI,CAAC;IAEnC,KAAK,CAAC,QAAQ;QACV,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IAED,8EAA8E;IAE9E,+DAA+D;IACxD,KAAK,CAAC,SAAS,CAAC,GAAqB;QACxC,IAAI,IAAI,CAAC,SAAS,KAAK,GAAG;YAAE,OAAO;QACnC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,8CAA8C;IACvC,KAAK,CAAC,OAAO;QAChB,IAAI,IAAI,CAAC,SAAS,KAAK,gBAAgB,EAAE,CAAC;YACtC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAClC,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChC,CAAC;IACL,CAAC;IAED,8EAA8E;IAE9E,UAAU,CAAC,GAAqB;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,UAAU,CAAC,GAAyB;QAChC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,OAAO;QACH,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAyB,EAAE,KAAY;QAClD,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,cAAc;YAAE,OAAO;QAEhC,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU;YAAE,OAAO;QAExB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAa,UAAU,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;YAChF,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,IAAI,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC;gBACvD,OAAO;YACX,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,IAAI,CAAC,QAAQ,CAAC,kBAAkB,MAAM,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC,CAAC;gBAC3F,OAAO;YACX,CAAC;YACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;IACL,CAAC;IAED,WAAW,CAAC,KAA+B;QACvC,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAED,YAAY,CAAC,OAA2B;QACpC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,aAAa,CAAC,IAAY,EAAE,CAA2B;QACnD,OAAO,CAAC,CAAC,UAAU,CAAC;IACxB,CAAC;IAED,UAAU,CAAC,IAAY,EAAE,CAAuB;QAC5C,OAAO,CAAC,CAAC,cAAc,IAAI,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;IAC5F,CAAC;IAED,8EAA8E;IAEtE,KAAK,CAAC,OAAO,CAAC,GAAqB;QACvC,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;YAC3B,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC1D,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAClC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACtD,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAChC,CAAC;QACL,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;YAChF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,cAAc;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;YAC/E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEO,aAAa,CAAC,IAA4B;QAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkC,CAAC;QACzD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,MAAM,GAA+B,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC;gBACR,UAAU,EAAE,UAAU;gBACtB,IAAI,EAAE,gBAAgB,CAAC,aAAa,CAAC,UAAU,CAAC;gBAChD,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;gBACrF,QAAQ,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;aAC9B,CAAC,CAAC;QACP,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3E,CAAC;IAEO,QAAQ,CAAC,OAAe;QAC5B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEO,aAAa,CAAC,GAAyB;QAC3C,MAAM,aAAa,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;QACnF,MAAM,YAAY,GAAG,GAAG,CAAC,WAAW,IAAI,WAAW,CAAC;QACpD,MAAM,OAAO,GAAG,oBAAoB,aAAa,QAAQ,YAAY,0BAA0B,CAAC;QAEhG,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACpC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAChC,KAAK,EAAE,IAAI,CAAC,kBAAkB;gBAC9B,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE;oBACL,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE;oBACtD,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;iBACrC;gBACD,KAAK,EAAE,GAAG;gBACV,QAAQ,EAAE,GAAG;aAChB,CAAC,CAAC;YAEH,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC5B,MAAM,MAAM,GAAG,MAAoC,CAAC;gBACpD,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YACtE,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;qRA5OQ,0BAA0B,yBAA1B,0BAA0B;6DAA1B,0BAA0B;YC5F/B,AADJ,AADJ,iCAAiC,aACX,gBAI6B;YAAvC,0GAAS,eAAW,gBAAgB,CAAC,IAAC;YACtC,0BAAiC;YACjC,gCACJ;YAAA,oBAAS;YACT,oCAGyC;YAArC,0GAAS,eAAW,cAAc,CAAC,IAAC;YACpC,0BAAuC;YACvC,8BACJ;YAAA,oBAAS;YACT,4BAA0B;YAC1B,+FAAuB;YAK3B,oBAAM;YAEN,8FAAoB;YA4ClB,AArCF,oFAAsC,8DAqC7B;YA6Cb,oBAAM;;YA7GM,eAA+C;YAA/C,4DAA+C;YAO/C,eAA6C;YAA7C,0DAA6C;YAMjD,eAIC;YAJD,8CAIC;YAGL,cAKC;YALD,4CAKC;YAED,cAiFC;YAjFD,8DAiFC;4BDvBS,YAAY;;iFAKb,0BAA0B;cARtC,SAAS;6BACM,IAAI,YACN,wBAAwB,WACzB,CAAC,YAAY,CAAC,mBACN,uBAAuB,CAAC,MAAM;;kBAW9C,KAAK;;kBAML,KAAK;;kBAGL,KAAK;;kBAOL,KAAK;;kBAKL,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kFAxCE,0BAA0B","sourcesContent":["import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n BaseEntity,\n CompositeKey,\n LogError,\n NormalizedPermission,\n PermissionAction,\n} from '@memberjunction/core';\nimport { PermissionEngine } from '@memberjunction/core-entities';\nimport { MJDialogAction, MJDialogService } from '@memberjunction/ng-ui-components';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\n/** Which tab the Sharing Center is currently displaying. */\nexport type SharingCenterTab = 'shared-with-me' | 'shared-by-me';\n\n/**\n * One collapsible domain section rendered by {@link UserSharingCenterComponent}.\n * Exported because consumers occasionally want to render their own custom layout\n * around the same shape.\n */\nexport interface SharingCenterDomainGroup {\n DomainName: string;\n Icon: string;\n Rows: NormalizedPermission[];\n Expanded: boolean;\n}\n\n/**\n * Default domain → entity-name mapping used by the Sharing Center to load and\n * delete the underlying permission record on Revoke. Apps with custom permission\n * domains can pass a replacement function via `SharingEntityResolver`.\n */\nexport const DefaultSharingEntityResolver = (domainName: string): string | null => {\n switch (domainName) {\n case 'Dashboard Permissions':\n return 'MJ: Dashboard Permissions';\n case 'Artifact Permissions':\n return 'MJ: Artifact Permissions';\n case 'Collection Permissions':\n return 'MJ: Collection Permissions';\n case 'Access Control Rules':\n return 'MJ: Access Control Rules';\n case 'Resource Permissions':\n return 'MJ: Resource Permissions';\n default:\n return null;\n }\n};\n\n/**\n * **Generic, framework-agnostic Sharing Center.** Renders two tabs:\n *\n * - **Shared with me** — every resource the current user has direct (non-role)\n * access to, grouped by permission domain. Each row is clickable and emits\n * `ResourceClicked` so the embedding app can route to the resource. The Generic\n * component never imports Angular Router / NavigationService — the parent\n * decides how to navigate.\n *\n * - **Shared by me** — every permission record where the current user is the\n * grantor. Each row has a Revoke button that deletes the underlying permission\n * record through `Metadata.GetEntityObject().Delete()` (so audit captures the\n * revoke and BaseEntity event-driven cache invalidation runs).\n *\n * Inputs / Outputs are designed so the component drops cleanly into a dialog,\n * a side panel, an embedded widget, or a full-page route.\n *\n * @example\n * ```html\n * <mj-user-sharing-center\n * [ActiveTab]=\"tab\"\n * (ActiveTabChange)=\"tab = $event\"\n * (ResourceClicked)=\"OnResourceClicked($event)\"\n * (CloseRequested)=\"dialogRef.Close()\">\n * </mj-user-sharing-center>\n * ```\n */\n@Component({\n standalone: true,\n selector: 'mj-user-sharing-center',\n imports: [CommonModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './user-sharing-center.component.html',\n styleUrls: ['./user-sharing-center.component.css'],\n})\nexport class UserSharingCenterComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly dialogService = inject(MJDialogService);\n\n // ─── Inputs ────────────────────────────────────────────────────────────────\n\n /** Which tab is shown initially. Two-way bindable via `ActiveTabChange`. */\n @Input() ActiveTab: SharingCenterTab = 'shared-with-me';\n\n /**\n * When true, the close button is rendered in the tab strip. Hide it when the\n * embedding container provides its own close affordance.\n */\n @Input() ShowCloseButton = true;\n\n /** Title text displayed in the confirm-revoke dialog. */\n @Input() RevokeConfirmTitle = 'Revoke access';\n\n /**\n * Maps a permission domain name (e.g. `\"Dashboard Permissions\"`) to the entity\n * name used to load and delete the underlying record on Revoke. Replace to add\n * support for custom domains. Defaults to {@link DefaultSharingEntityResolver}.\n */\n @Input() SharingEntityResolver: (domainName: string) => string | null = DefaultSharingEntityResolver;\n\n // ─── Outputs ───────────────────────────────────────────────────────────────\n\n /** Two-way binding partner for `ActiveTab`. */\n @Output() ActiveTabChange = new EventEmitter<SharingCenterTab>();\n\n /** Fired when a row in the \"Shared with me\" tab is clicked. */\n @Output() ResourceClicked = new EventEmitter<NormalizedPermission>();\n\n /** Fired when the user clicks the close button. Parent should close the host dialog/panel. */\n @Output() CloseRequested = new EventEmitter<void>();\n\n /** Fired after a permission has been successfully revoked. */\n @Output() PermissionRevoked = new EventEmitter<NormalizedPermission>();\n\n /** Fired whenever an error is shown to the user. Useful for parent telemetry. */\n @Output() ErrorOccurred = new EventEmitter<string>();\n\n // ─── Public state (read by template) ───────────────────────────────────────\n\n SharedWithMe: SharingCenterDomainGroup[] = [];\n SharedByMe: SharingCenterDomainGroup[] = [];\n\n IsLoadingWithMe = false;\n IsLoadingByMe = false;\n\n ErrorMessage: string | null = null;\n\n async ngOnInit(): Promise<void> {\n await this.loadTab(this.ActiveTab);\n }\n\n // ─── Public methods (callable from parent via @ViewChild) ──────────────────\n\n /** Switch to a tab and load its data if not already loaded. */\n public async SwitchTab(tab: SharingCenterTab): Promise<void> {\n if (this.ActiveTab === tab) return;\n this.ActiveTab = tab;\n this.ActiveTabChange.emit(tab);\n await this.loadTab(tab);\n }\n\n /** Force-refresh the currently active tab. */\n public async Refresh(): Promise<void> {\n if (this.ActiveTab === 'shared-with-me') {\n this.SharedWithMe = [];\n await this.loadSharedWithMe();\n } else {\n this.SharedByMe = [];\n await this.loadSharedByMe();\n }\n }\n\n // ─── Template event handlers ───────────────────────────────────────────────\n\n OnTabClick(tab: SharingCenterTab): Promise<void> {\n return this.SwitchTab(tab);\n }\n\n OnRowClick(row: NormalizedPermission): void {\n this.ResourceClicked.emit(row);\n }\n\n OnClose(): void {\n this.CloseRequested.emit();\n }\n\n async OnRevoke(row: NormalizedPermission, event: Event): Promise<void> {\n event.stopPropagation();\n if (!row.SourceRecordID) return;\n\n const entityName = this.SharingEntityResolver(row.DomainName);\n if (!entityName) return;\n\n const confirmed = await this.confirmRevoke(row);\n if (!confirmed) return;\n\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<BaseEntity>(entityName, md.CurrentUser);\n const key = new CompositeKey();\n key.KeyValuePairs.push({ FieldName: 'ID', Value: row.SourceRecordID });\n const loaded = await entity.InnerLoad(key);\n if (!loaded) {\n this.setError('Could not load the permission record.');\n return;\n }\n const deleted = await entity.Delete();\n if (!deleted) {\n this.setError(`Revoke failed: ${entity.LatestResult?.CompleteMessage ?? 'unknown error'}`);\n return;\n }\n this.PermissionRevoked.emit(row);\n await this.Refresh();\n } catch (e) {\n this.setError(`Revoke failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n ToggleGroup(group: SharingCenterDomainGroup): void {\n group.Expanded = !group.Expanded;\n this.cdr.detectChanges();\n }\n\n ActionsLabel(actions: PermissionAction[]): string {\n return actions.join(', ');\n }\n\n TrackByDomain(_idx: number, g: SharingCenterDomainGroup): string {\n return g.DomainName;\n }\n\n TrackByRow(_idx: number, r: NormalizedPermission): string {\n return r.SourceRecordID ?? `${r.DomainName}|${r.ResourceID ?? ''}|${r.GranteeID ?? ''}`;\n }\n\n // ─── Internal helpers ──────────────────────────────────────────────────────\n\n private async loadTab(tab: SharingCenterTab): Promise<void> {\n if (tab === 'shared-with-me') {\n if (this.SharedWithMe.length === 0 && !this.IsLoadingWithMe) {\n await this.loadSharedWithMe();\n }\n } else {\n if (this.SharedByMe.length === 0 && !this.IsLoadingByMe) {\n await this.loadSharedByMe();\n }\n }\n }\n\n private async loadSharedWithMe(): Promise<void> {\n const user = this.ProviderToUse.CurrentUser;\n if (!user) return;\n\n this.IsLoadingWithMe = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n try {\n const rows = await PermissionEngine.Instance.GetPermissionsSharedWithUser(user);\n this.SharedWithMe = this.groupByDomain(rows);\n } catch (e) {\n this.setError(`Failed to load shares: ${e instanceof Error ? e.message : String(e)}`);\n }\n this.IsLoadingWithMe = false;\n this.cdr.detectChanges();\n }\n\n private async loadSharedByMe(): Promise<void> {\n const user = this.ProviderToUse.CurrentUser;\n if (!user) return;\n\n this.IsLoadingByMe = true;\n this.ErrorMessage = null;\n this.cdr.detectChanges();\n try {\n const rows = await PermissionEngine.Instance.GetPermissionsGrantedByUser(user);\n this.SharedByMe = this.groupByDomain(rows);\n } catch (e) {\n this.setError(`Failed to load grants: ${e instanceof Error ? e.message : String(e)}`);\n }\n this.IsLoadingByMe = false;\n this.cdr.detectChanges();\n }\n\n private groupByDomain(rows: NormalizedPermission[]): SharingCenterDomainGroup[] {\n const bucket = new Map<string, NormalizedPermission[]>();\n for (const r of rows) {\n const list = bucket.get(r.DomainName) ?? [];\n list.push(r);\n bucket.set(r.DomainName, list);\n }\n const groups: SharingCenterDomainGroup[] = [];\n for (const [domainName, list] of bucket) {\n groups.push({\n DomainName: domainName,\n Icon: PermissionEngine.DomainIconFor(domainName),\n Rows: list.sort((a, b) => (a.ResourceName ?? '').localeCompare(b.ResourceName ?? '')),\n Expanded: list.length <= 10,\n });\n }\n return groups.sort((a, b) => a.DomainName.localeCompare(b.DomainName));\n }\n\n private setError(message: string): void {\n this.ErrorMessage = message;\n this.ErrorOccurred.emit(message);\n LogError(message);\n this.cdr.detectChanges();\n }\n\n private confirmRevoke(row: NormalizedPermission): Promise<boolean> {\n const resourceLabel = row.ResourceName ? `\"${row.ResourceName}\"` : 'this resource';\n const granteeLabel = row.GranteeName ?? 'this user';\n const message = `Revoke access to ${resourceLabel} for ${granteeLabel}? This cannot be undone.`;\n\n return new Promise<boolean>((resolve) => {\n const ref = this.dialogService.open({\n title: this.RevokeConfirmTitle,\n content: message,\n actions: [\n { text: 'Revoke', primary: true, themeColor: 'error' },\n { text: 'Cancel', primary: false },\n ],\n width: 420,\n minWidth: 300,\n });\n\n ref.Result.subscribe((result) => {\n const action = result as MJDialogAction | undefined;\n resolve(!!action && 'text' in action && action.text === 'Revoke');\n });\n });\n }\n}\n","<div class=\"user-sharing-center\">\n <div class=\"tabs\">\n <button\n class=\"tab\"\n [class.active]=\"ActiveTab === 'shared-with-me'\"\n (click)=\"OnTabClick('shared-with-me')\">\n <i class=\"fa-solid fa-inbox\"></i>\n Shared with me\n </button>\n <button\n class=\"tab\"\n [class.active]=\"ActiveTab === 'shared-by-me'\"\n (click)=\"OnTabClick('shared-by-me')\">\n <i class=\"fa-solid fa-paper-plane\"></i>\n Shared by me\n </button>\n <div class=\"spacer\"></div>\n @if (ShowCloseButton) {\n <button class=\"close\" (click)=\"OnClose()\" title=\"Close\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n\n @if (ErrorMessage) {\n <div class=\"error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n {{ ErrorMessage }}\n </div>\n }\n\n @if (ActiveTab === 'shared-with-me') {\n @if (IsLoadingWithMe) {\n <div class=\"loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading…\n </div>\n } @else if (SharedWithMe.length === 0) {\n <div class=\"empty\">\n <i class=\"fa-solid fa-inbox\"></i>\n Nothing has been shared directly with you yet.\n </div>\n } @else {\n @for (group of SharedWithMe; track TrackByDomain($index, group)) {\n <div class=\"group\">\n <button class=\"group-header\" (click)=\"ToggleGroup(group)\">\n <i [class]=\"group.Icon\"></i>\n <span class=\"group-name\">{{ group.DomainName }}</span>\n <span class=\"count\">{{ group.Rows.length }}</span>\n <i class=\"fa-solid chevron\" [class.fa-chevron-down]=\"group.Expanded\" [class.fa-chevron-right]=\"!group.Expanded\"></i>\n </button>\n @if (group.Expanded) {\n <div class=\"rows\">\n @for (row of group.Rows; track TrackByRow($index, row)) {\n <button class=\"row\" (click)=\"OnRowClick(row)\">\n <span class=\"resource\">{{ row.ResourceName || row.ResourceID }}</span>\n <span class=\"resource-type\">{{ row.ResourceType }}</span>\n <span class=\"actions\">{{ ActionsLabel(row.Actions) }}</span>\n @if (row.ExpiresAt) {\n <span class=\"expires\">expires {{ row.ExpiresAt | date:'mediumDate' }}</span>\n }\n </button>\n }\n </div>\n }\n </div>\n }\n }\n } @else {\n @if (IsLoadingByMe) {\n <div class=\"loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n Loading…\n </div>\n } @else if (SharedByMe.length === 0) {\n <div class=\"empty\">\n <i class=\"fa-solid fa-paper-plane\"></i>\n You haven't shared anything with others yet.\n </div>\n } @else {\n @for (group of SharedByMe; track TrackByDomain($index, group)) {\n <div class=\"group\">\n <button class=\"group-header\" (click)=\"ToggleGroup(group)\">\n <i [class]=\"group.Icon\"></i>\n <span class=\"group-name\">{{ group.DomainName }}</span>\n <span class=\"count\">{{ group.Rows.length }}</span>\n <i class=\"fa-solid chevron\" [class.fa-chevron-down]=\"group.Expanded\" [class.fa-chevron-right]=\"!group.Expanded\"></i>\n </button>\n @if (group.Expanded) {\n <div class=\"rows\">\n @for (row of group.Rows; track TrackByRow($index, row)) {\n <div class=\"row editable\">\n <span class=\"resource\">{{ row.ResourceName || row.ResourceID }}</span>\n <span class=\"resource-type\">{{ row.ResourceType }}</span>\n <span class=\"grantee\">\n <i class=\"fa-solid fa-user\"></i>\n {{ row.GranteeName || row.GranteeType }}\n </span>\n <span class=\"actions\">{{ ActionsLabel(row.Actions) }}</span>\n @if (row.ExpiresAt) {\n <span class=\"expires\">expires {{ row.ExpiresAt | date:'mediumDate' }}</span>\n }\n <button class=\"revoke\" (click)=\"OnRevoke(row, $event)\" title=\"Revoke access\">\n <i class=\"fa-solid fa-trash\"></i>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n }\n }\n</div>\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-resource-permissions",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.31.0",
|
|
4
4
|
"description": "MemberJunction: Generic Angular components for displaying/editing permissions for a resource",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -27,15 +27,15 @@
|
|
|
27
27
|
"@angular/router": "21.1.3"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@memberjunction/core": "5.
|
|
31
|
-
"@memberjunction/core-entities": "5.
|
|
32
|
-
"@memberjunction/global": "5.
|
|
33
|
-
"@memberjunction/ng-base-types": "5.
|
|
34
|
-
"@memberjunction/ng-container-directives": "5.
|
|
35
|
-
"@memberjunction/ng-generic-dialog": "5.
|
|
36
|
-
"@memberjunction/ng-notifications": "5.
|
|
37
|
-
"@memberjunction/ng-shared-generic": "5.
|
|
38
|
-
"@memberjunction/ng-ui-components": "5.
|
|
30
|
+
"@memberjunction/core": "5.31.0",
|
|
31
|
+
"@memberjunction/core-entities": "5.31.0",
|
|
32
|
+
"@memberjunction/global": "5.31.0",
|
|
33
|
+
"@memberjunction/ng-base-types": "5.31.0",
|
|
34
|
+
"@memberjunction/ng-container-directives": "5.31.0",
|
|
35
|
+
"@memberjunction/ng-generic-dialog": "5.31.0",
|
|
36
|
+
"@memberjunction/ng-notifications": "5.31.0",
|
|
37
|
+
"@memberjunction/ng-shared-generic": "5.31.0",
|
|
38
|
+
"@memberjunction/ng-ui-components": "5.31.0",
|
|
39
39
|
"ag-grid-angular": "^35.0.1",
|
|
40
40
|
"ag-grid-community": "^35.0.1",
|
|
41
41
|
"tslib": "^2.8.1"
|