@memberjunction/ng-entity-permissions 6.2.0-edge.0 → 6.2.0-edge.2

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.
@@ -8,8 +8,14 @@ export declare class EntityPermissionsSelectorWithGridComponent extends BaseAngu
8
8
  BottomMargin: number;
9
9
  PermissionChanged: EventEmitter<EntityPermissionChangedEvent>;
10
10
  CurrentEntity: EntityInfo | undefined;
11
- entityList: EntityInfo[];
11
+ EntityList: EntityInfo[];
12
+ /** @deprecated Use {@link EntityList}. */
13
+ get entityList(): EntityInfo[];
14
+ /** @deprecated Use {@link EntityList}. */
15
+ set entityList(value: EntityInfo[]);
12
16
  ngOnInit(): void;
17
+ HandlePermissionChanged(event: EntityPermissionChangedEvent): void;
18
+ /** @deprecated Use {@link HandlePermissionChanged}. */
13
19
  handlePermissionChanged(event: EntityPermissionChangedEvent): void;
14
20
  static ɵfac: i0.ɵɵFactoryDeclaration<EntityPermissionsSelectorWithGridComponent, never>;
15
21
  static ɵcmp: i0.ɵɵComponentDeclaration<EntityPermissionsSelectorWithGridComponent, "mj-entity-permissions-selector-with-grid", never, { "EntityName": { "alias": "EntityName"; "required": false; }; "BottomMargin": { "alias": "BottomMargin"; "required": false; }; "CurrentEntity": { "alias": "CurrentEntity"; "required": false; }; }, { "PermissionChanged": "PermissionChanged"; }, never, never, false, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"entity-selector-with-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/entity-selector-with-grid/entity-selector-with-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,YAAY,EAAE,MAAM,EAAS,MAAM,eAAe,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAY,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AAIzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,qBAMa,0CAA2C,SAAQ,oBAAqB,YAAW,MAAM;IAC3F,UAAU,EAAG,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAK;IAExB,iBAAiB,6CAAoD;IAEtE,aAAa,EAAE,UAAU,GAAG,SAAS,CAAC;IAExC,UAAU,EAAE,UAAU,EAAE,CAAM;IAC9B,QAAQ,IAAI,IAAI;IAQhB,uBAAuB,CAAC,KAAK,EAAE,4BAA4B;yCAjBvD,0CAA0C;2CAA1C,0CAA0C;CAuBtD"}
1
+ {"version":3,"file":"entity-selector-with-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/entity-selector-with-grid/entity-selector-with-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,YAAY,EAAE,MAAM,EAAS,MAAM,eAAe,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAY,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAC;AAIzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,qBAMa,0CAA2C,SAAQ,oBAAqB,YAAW,MAAM;IAC3F,UAAU,EAAG,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAK;IAExB,iBAAiB,6CAAoD;IAEtE,aAAa,EAAE,UAAU,GAAG,SAAS,CAAC;IAExC,UAAU,EAAE,UAAU,EAAE,CAAM;IAErC,0CAA0C;IAC1C,IAAW,UAAU,IAAI,UAAU,EAAE,CAEpC;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,EAExC;IACM,QAAQ,IAAI,IAAI;IAQhB,uBAAuB,CAAC,KAAK,EAAE,4BAA4B;IAOlE,uDAAuD;IAChD,uBAAuB,CAAC,KAAK,EAAE,4BAA4B;yCAlCvD,0CAA0C;2CAA1C,0CAA0C;CAqCtD"}
@@ -18,18 +18,30 @@ export class EntityPermissionsSelectorWithGridComponent extends BaseAngularCompo
18
18
  BottomMargin = 0;
19
19
  PermissionChanged = new EventEmitter();
20
20
  CurrentEntity;
21
- entityList = [];
21
+ EntityList = [];
22
+ /** @deprecated Use {@link EntityList}. */
23
+ get entityList() {
24
+ return this.EntityList;
25
+ }
26
+ /** @deprecated Use {@link EntityList}. */
27
+ set entityList(value) {
28
+ this.EntityList = value;
29
+ }
22
30
  ngOnInit() {
23
31
  // Copy before sorting — provider.Entities is the provider's live (shared) metadata
24
32
  // array; Array.prototype.sort would reorder it in place for every consumer.
25
- this.entityList = [...this.ProviderToUse.Entities].sort((a, b) => a.Name.localeCompare(b.Name));
26
- if (this.entityList?.length > 0)
27
- this.CurrentEntity = this.entityList[0];
33
+ this.EntityList = [...this.ProviderToUse.Entities].sort((a, b) => a.Name.localeCompare(b.Name));
34
+ if (this.EntityList?.length > 0)
35
+ this.CurrentEntity = this.EntityList[0];
28
36
  }
29
- handlePermissionChanged(event) {
37
+ HandlePermissionChanged(event) {
30
38
  // bubble up the event to our container component
31
39
  this.PermissionChanged.emit(event);
32
40
  }
41
+ /** @deprecated Use {@link HandlePermissionChanged}. */
42
+ handlePermissionChanged(event) {
43
+ return this.HandlePermissionChanged(event);
44
+ }
33
45
  static ɵfac = /*@__PURE__*/ (() => { let ɵEntityPermissionsSelectorWithGridComponent_BaseFactory; return function EntityPermissionsSelectorWithGridComponent_Factory(__ngFactoryType__) { return (ɵEntityPermissionsSelectorWithGridComponent_BaseFactory || (ɵEntityPermissionsSelectorWithGridComponent_BaseFactory = i0.ɵɵgetInheritedFactory(EntityPermissionsSelectorWithGridComponent)))(__ngFactoryType__ || EntityPermissionsSelectorWithGridComponent); }; })();
34
46
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: EntityPermissionsSelectorWithGridComponent, selectors: [["mj-entity-permissions-selector-with-grid"]], inputs: { EntityName: "EntityName", BottomMargin: "BottomMargin", CurrentEntity: "CurrentEntity" }, outputs: { PermissionChanged: "PermissionChanged" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 3, consts: [["TextField", "Name", "ValueField", "Name", "Placeholder", "Select an entity...", 1, "entity-selector", 3, "ngModelChange", "Data", "ngModel"], [1, "inner-grid", 3, "EntityName"], [1, "inner-grid", 3, "PermissionChanged", "EntityName"]], template: function EntityPermissionsSelectorWithGridComponent_Template(rf, ctx) { if (rf & 1) {
35
47
  i0.ɵɵelementStart(0, "div")(1, "mj-dropdown", 0);
@@ -1 +1 @@
1
- {"version":3,"file":"entity-selector-with-grid.component.js","sourceRoot":"","sources":["../../../src/lib/entity-selector-with-grid/entity-selector-with-grid.component.ts","../../../src/lib/entity-selector-with-grid/entity-selector-with-grid.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAU,KAAK,EAAE,MAAM,eAAe,CAAC;AAO/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;;;;;;ICIjE,qDAAuI;IAAtD,gQAAqB,sCAA+B,KAAC;IAAC,iBAA6B;;;IAArH,sDAAiC;;ADGpF,MAAM,OAAO,0CAA2C,SAAQ,oBAAoB;IACzE,UAAU,CAAU;IACpB,YAAY,GAAW,CAAC,CAAC;IAExB,iBAAiB,GAAG,IAAI,YAAY,EAAgC,CAAC;IAEtE,aAAa,CAAyB;IAExC,UAAU,GAAiB,EAAE,CAAC;IAC9B,QAAQ;QACb,mFAAmF;QACnF,4EAA4E;QAC5E,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAChG,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAEM,uBAAuB,CAAC,KAAmC;QAChE,iDAAiD;QACjD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CACzB,KAAK,CACN,CAAC;IACJ,CAAC;qVAtBU,0CAA0C,yBAA1C,0CAA0C;6DAA1C,0CAA0C;YCbrD,AADF,2BAAM,qBAQD;YADD,oPAA2B;YAE7B,iBAAc;YACd,mIAAqB;YAGvB,iBAAM;;YAXF,cAAmB;YAAnB,qCAAmB;YAKnB,iDAA2B;YAG7B,cAEC;YAFD,4CAEC;;;iFDEU,0CAA0C;cANtD,SAAS;6BACI,KAAK,YACP,0CAA0C;;kBAKnD,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBAEN,KAAK;;kFANK,0CAA0C","sourcesContent":["import { Component, Output, EventEmitter, OnInit, Input } from '@angular/core';\n\nimport { EntityInfo, Metadata } from '@memberjunction/core';\nimport { EntityPermissionChangedEvent } from '../grid/entity-permissions-grid.component';\n\n \n \nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n@Component({\n standalone: false,\n selector: 'mj-entity-permissions-selector-with-grid',\n templateUrl: './entity-selector-with-grid.component.html',\n styleUrls: ['./entity-selector-with-grid.component.css']\n})\nexport class EntityPermissionsSelectorWithGridComponent extends BaseAngularComponent implements OnInit {\n @Input() EntityName!: string;\n @Input() BottomMargin: number = 0;\n\n @Output() PermissionChanged = new EventEmitter<EntityPermissionChangedEvent>();\n\n @Input() CurrentEntity: EntityInfo | undefined;\n\n public entityList: EntityInfo[] = [];\n public ngOnInit(): void {\n // Copy before sorting — provider.Entities is the provider's live (shared) metadata\n // array; Array.prototype.sort would reorder it in place for every consumer.\n this.entityList = [...this.ProviderToUse.Entities].sort((a, b) => a.Name.localeCompare(b.Name));\n if (this.entityList?.length > 0)\n this.CurrentEntity = this.entityList[0];\n }\n\n public handlePermissionChanged(event: EntityPermissionChangedEvent) {\n // bubble up the event to our container component\n this.PermissionChanged.emit(\n event\n );\n }\n}\n","<div >\n <mj-dropdown\n [Data]=\"entityList\"\n TextField=\"Name\"\n ValueField=\"Name\"\n Placeholder=\"Select an entity...\"\n class=\"entity-selector\"\n [(ngModel)]=\"CurrentEntity\"\n >\n </mj-dropdown>\n @if (CurrentEntity) {\n <mj-entity-permissions-grid class=\"inner-grid\" [EntityName]=\"CurrentEntity.Name\" (PermissionChanged)=\"handlePermissionChanged($event)\"></mj-entity-permissions-grid>\n }\n</div>\n"]}
1
+ {"version":3,"file":"entity-selector-with-grid.component.js","sourceRoot":"","sources":["../../../src/lib/entity-selector-with-grid/entity-selector-with-grid.component.ts","../../../src/lib/entity-selector-with-grid/entity-selector-with-grid.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAU,KAAK,EAAE,MAAM,eAAe,CAAC;AAO/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;;;;;;ICIjE,qDAAuI;IAAtD,gQAAqB,sCAA+B,KAAC;IAAC,iBAA6B;;;IAArH,sDAAiC;;ADGpF,MAAM,OAAO,0CAA2C,SAAQ,oBAAoB;IACzE,UAAU,CAAU;IACpB,YAAY,GAAW,CAAC,CAAC;IAExB,iBAAiB,GAAG,IAAI,YAAY,EAAgC,CAAC;IAEtE,aAAa,CAAyB;IAExC,UAAU,GAAiB,EAAE,CAAC;IAErC,0CAA0C;IAC1C,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAmB;QACvC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IACM,QAAQ;QACb,mFAAmF;QACnF,4EAA4E;QAC5E,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAChG,IAAI,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,CAAC;YAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAEM,uBAAuB,CAAC,KAAmC;QAChE,iDAAiD;QACjD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CACzB,KAAK,CACN,CAAC;IACJ,CAAC;IAED,uDAAuD;IAChD,uBAAuB,CAAC,KAAmC;QAChE,OAAO,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;qVApCU,0CAA0C,yBAA1C,0CAA0C;6DAA1C,0CAA0C;YCbrD,AADF,2BAAM,qBAQD;YADD,oPAA2B;YAE7B,iBAAc;YACd,mIAAqB;YAGvB,iBAAM;;YAXF,cAAmB;YAAnB,qCAAmB;YAKnB,iDAA2B;YAG7B,cAEC;YAFD,4CAEC;;;iFDEU,0CAA0C;cANtD,SAAS;6BACI,KAAK,YACP,0CAA0C;;kBAKnD,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBAEN,KAAK;;kFANK,0CAA0C","sourcesContent":["import { Component, Output, EventEmitter, OnInit, Input } from '@angular/core';\n\nimport { EntityInfo, Metadata } from '@memberjunction/core';\nimport { EntityPermissionChangedEvent } from '../grid/entity-permissions-grid.component';\n\n \n \nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n@Component({\n standalone: false,\n selector: 'mj-entity-permissions-selector-with-grid',\n templateUrl: './entity-selector-with-grid.component.html',\n styleUrls: ['./entity-selector-with-grid.component.css']\n})\nexport class EntityPermissionsSelectorWithGridComponent extends BaseAngularComponent implements OnInit {\n @Input() EntityName!: string;\n @Input() BottomMargin: number = 0;\n\n @Output() PermissionChanged = new EventEmitter<EntityPermissionChangedEvent>();\n\n @Input() CurrentEntity: EntityInfo | undefined;\n\n public EntityList: EntityInfo[] = [];\n\n /** @deprecated Use {@link EntityList}. */\n public get entityList(): EntityInfo[] {\n return this.EntityList;\n }\n /** @deprecated Use {@link EntityList}. */\n public set entityList(value: EntityInfo[]) {\n this.EntityList = value;\n }\n public ngOnInit(): void {\n // Copy before sorting — provider.Entities is the provider's live (shared) metadata\n // array; Array.prototype.sort would reorder it in place for every consumer.\n this.EntityList = [...this.ProviderToUse.Entities].sort((a, b) => a.Name.localeCompare(b.Name));\n if (this.EntityList?.length > 0)\n this.CurrentEntity = this.EntityList[0];\n }\n\n public HandlePermissionChanged(event: EntityPermissionChangedEvent) {\n // bubble up the event to our container component\n this.PermissionChanged.emit(\n event\n );\n }\n\n /** @deprecated Use {@link HandlePermissionChanged}. */\n public handlePermissionChanged(event: EntityPermissionChangedEvent) {\n return this.HandlePermissionChanged(event);\n }\n}\n","<div >\n <mj-dropdown\n [Data]=\"entityList\"\n TextField=\"Name\"\n ValueField=\"Name\"\n Placeholder=\"Select an entity...\"\n class=\"entity-selector\"\n [(ngModel)]=\"CurrentEntity\"\n >\n </mj-dropdown>\n @if (CurrentEntity) {\n <mj-entity-permissions-grid class=\"inner-grid\" [EntityName]=\"CurrentEntity.Name\" (PermissionChanged)=\"handlePermissionChanged($event)\"></mj-entity-permissions-grid>\n }\n</div>\n"]}
@@ -15,8 +15,16 @@ export declare class EntityPermissionsGridComponent extends BaseAngularComponent
15
15
  RoleName: string;
16
16
  BottomMargin: number;
17
17
  PermissionChanged: EventEmitter<EntityPermissionChangedEvent>;
18
- permissions: MJEntityPermissionEntity[];
19
- gridHeight: number;
18
+ Permissions: MJEntityPermissionEntity[];
19
+ /** @deprecated Use {@link Permissions}. */
20
+ get permissions(): MJEntityPermissionEntity[];
21
+ /** @deprecated Use {@link Permissions}. */
22
+ set permissions(value: MJEntityPermissionEntity[]);
23
+ GridHeight: number;
24
+ /** @deprecated Use {@link GridHeight}. */
25
+ get gridHeight(): number;
26
+ /** @deprecated Use {@link GridHeight}. */
27
+ set gridHeight(value: number);
20
28
  isLoading: boolean;
21
29
  /**
22
30
  * Role-name lookup keyed by NormalizeUUID(roleID). Built once when roles are
@@ -35,14 +43,28 @@ export declare class EntityPermissionsGridComponent extends BaseAngularComponent
35
43
  * `md.Roles` during change detection.
36
44
  */
37
45
  private buildRoleNameMap;
46
+ GetRoleName(roleID: string): string;
47
+ /** @deprecated Use {@link GetRoleName}. */
38
48
  getRoleName(roleID: string): string;
49
+ SavePermissions(): Promise<void>;
50
+ /** @deprecated Use {@link SavePermissions}. */
39
51
  savePermissions(): Promise<void>;
52
+ CancelEdit(): Promise<void>;
53
+ /** @deprecated Use {@link CancelEdit}. */
40
54
  cancelEdit(): Promise<void>;
41
55
  get NumDirtyPermissions(): number;
42
56
  protected IsPermissionReallyDirty(p: MJEntityPermissionEntity): boolean;
57
+ FlipAllPermissions(type: 'Read' | 'Create' | 'Update' | 'Delete'): void;
58
+ /** @deprecated Use {@link FlipAllPermissions}. */
43
59
  flipAllPermissions(type: 'Read' | 'Create' | 'Update' | 'Delete'): void;
60
+ RevertRow(event: MouseEvent, permission: MJEntityPermissionEntity): void;
61
+ /** @deprecated Use {@link RevertRow}. */
44
62
  revertRow(event: MouseEvent, permission: MJEntityPermissionEntity): void;
63
+ FlipRow(permission: MJEntityPermissionEntity): void;
64
+ /** @deprecated Use {@link FlipRow}. */
45
65
  flipRow(permission: MJEntityPermissionEntity): void;
66
+ FlipPermission(event: MouseEvent | undefined, permission: MJEntityPermissionEntity, type: 'Read' | 'Create' | 'Update' | 'Delete', flipPermission: boolean): void;
67
+ /** @deprecated Use {@link FlipPermission}. */
46
68
  flipPermission(event: MouseEvent | undefined, permission: MJEntityPermissionEntity, type: 'Read' | 'Create' | 'Update' | 'Delete', flipPermission: boolean): void;
47
69
  static ɵfac: i0.ɵɵFactoryDeclaration<EntityPermissionsGridComponent, never>;
48
70
  static ɵcmp: i0.ɵɵComponentDeclaration<EntityPermissionsGridComponent, "mj-entity-permissions-grid", never, { "Mode": { "alias": "Mode"; "required": false; }; "EntityName": { "alias": "EntityName"; "required": false; }; "RoleName": { "alias": "RoleName"; "required": false; }; "BottomMargin": { "alias": "BottomMargin"; "required": false; }; }, { "PermissionChanged": "PermissionChanged"; }, never, never, false, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"entity-permissions-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/grid/entity-permissions-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,YAAY,EAAE,MAAM,EAAS,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAIzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,qBAAqB,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC9D,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,qBAMa,8BAA+B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAC1F,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAY;IACnC,UAAU,EAAG,MAAM,CAAC;IACpB,QAAQ,EAAG,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAK;IAExB,iBAAiB,6CAAoD;IAExE,WAAW,EAAE,wBAAwB,EAAE,CAAM;IAC7C,UAAU,EAAE,MAAM,CAAO;IACzB,SAAS,EAAE,OAAO,CAAS;IAElC;;;;OAIG;IACH,OAAO,CAAC,WAAW,CAA6B;;IAMhD,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa;IAOlC,cAAc;IAMR,OAAO;IA8Eb;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAQjB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAK7B,eAAe;IAkBf,UAAU;IAWvB,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAED,SAAS,CAAC,uBAAuB,CAAC,CAAC,EAAE,wBAAwB,GAAG,OAAO;IAShE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ;IAoDhE,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,wBAAwB;IAOjE,OAAO,CAAC,UAAU,EAAE,wBAAwB;IA0B5C,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE,cAAc,EAAE,OAAO;yCAvQtJ,8BAA8B;2CAA9B,8BAA8B;CAqS1C"}
1
+ {"version":3,"file":"entity-permissions-grid.component.d.ts","sourceRoot":"","sources":["../../../src/lib/grid/entity-permissions-grid.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,YAAY,EAAE,MAAM,EAAS,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAIzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;;AACrE,MAAM,MAAM,4BAA4B,GAAG;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,qBAAqB,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAC9D,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB,CAAA;AAED,qBAMa,8BAA+B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAC1F,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAY;IACnC,UAAU,EAAG,MAAM,CAAC;IACpB,QAAQ,EAAG,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAK;IAExB,iBAAiB,6CAAoD;IAExE,WAAW,EAAE,wBAAwB,EAAE,CAAM;IAEpD,2CAA2C;IAC3C,IAAW,WAAW,IAAI,wBAAwB,EAAE,CAEnD;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK,EAAE,wBAAwB,EAAE,EAEvD;IACM,UAAU,EAAE,MAAM,CAAO;IAEhC,0CAA0C;IAC1C,IAAW,UAAU,IAAI,MAAM,CAE9B;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAK,EAAE,MAAM,EAElC;IACM,SAAS,EAAE,OAAO,CAAS;IAElC;;;;OAIG;IACH,OAAO,CAAC,WAAW,CAA6B;;IAMhD,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa;IAOlC,cAAc;IAMR,OAAO;IAkFb;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAQjB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAK1C,2CAA2C;IACpC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAI7B,eAAe;IAkB5B,+CAA+C;IAClC,eAAe;IAIf,UAAU;IAWvB,0CAA0C;IAC7B,UAAU;IAIvB,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAED,SAAS,CAAC,uBAAuB,CAAC,CAAC,EAAE,wBAAwB,GAAG,OAAO;IAShE,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ;IAoDvE,kDAAkD;IAC3C,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ;IAIhE,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,wBAAwB;IAOxE,yCAAyC;IAClC,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,wBAAwB;IAIjE,OAAO,CAAC,UAAU,EAAE,wBAAwB;IA0BnD,uCAAuC;IAChC,OAAO,CAAC,UAAU,EAAE,wBAAwB;IAI5C,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE,cAAc,EAAE,OAAO;IA+BjK,8CAA8C;IACvC,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EAAE,cAAc,EAAE,OAAO;yCA3VtJ,8BAA8B;2CAA9B,8BAA8B;CA8V1C"}
@@ -1,6 +1,6 @@
1
1
  import { Component, Output, EventEmitter, Input } from '@angular/core';
2
2
  import { RunView } from '@memberjunction/core';
3
- import { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';
3
+ import { NormalizeUUID } from '@memberjunction/global';
4
4
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/common";
@@ -137,8 +137,24 @@ export class EntityPermissionsGridComponent extends BaseAngularComponent {
137
137
  RoleName; // used when Mode is 'Role'
138
138
  BottomMargin = 0;
139
139
  PermissionChanged = new EventEmitter();
140
- permissions = [];
141
- gridHeight = 750;
140
+ Permissions = [];
141
+ /** @deprecated Use {@link Permissions}. */
142
+ get permissions() {
143
+ return this.Permissions;
144
+ }
145
+ /** @deprecated Use {@link Permissions}. */
146
+ set permissions(value) {
147
+ this.Permissions = value;
148
+ }
149
+ GridHeight = 750;
150
+ /** @deprecated Use {@link GridHeight}. */
151
+ get gridHeight() {
152
+ return this.GridHeight;
153
+ }
154
+ /** @deprecated Use {@link GridHeight}. */
155
+ set gridHeight(value) {
156
+ this.GridHeight = value;
157
+ }
142
158
  isLoading = false;
143
159
  /**
144
160
  * Role-name lookup keyed by NormalizeUUID(roleID). Built once when roles are
@@ -192,7 +208,9 @@ export class EntityPermissionsGridComponent extends BaseAngularComponent {
192
208
  const existingPermissions = result.Results;
193
209
  const roles = md.Roles;
194
210
  if (this.Mode === 'Entity') {
195
- const rolesWithNoPermissions = roles.filter(r => !existingPermissions.some(p => UUIDsEqual(p.RoleID, r.ID)));
211
+ // A normalized Set, not a nested UUIDsEqual scan: roles x permissions grows with both.
212
+ const rolesWithPermissions = new Set(existingPermissions.map(p => NormalizeUUID(p.RoleID)));
213
+ const rolesWithNoPermissions = roles.filter(r => !rolesWithPermissions.has(NormalizeUUID(r.ID)));
196
214
  for (const r of rolesWithNoPermissions) {
197
215
  const p = await md.GetEntityObject('MJ: Entity Permissions');
198
216
  await p.LoadFromData({
@@ -207,11 +225,13 @@ export class EntityPermissionsGridComponent extends BaseAngularComponent {
207
225
  });
208
226
  existingPermissions.push(p);
209
227
  }
210
- this.permissions = existingPermissions;
228
+ this.Permissions = existingPermissions;
211
229
  }
212
230
  else if (this.Mode === 'Role') {
213
231
  // for the mode of Role, that means we want to show all entities and their permissions for the given role
214
- const entitiesWithNoPermissions = md.Entities.filter(e => !existingPermissions.some(p => UUIDsEqual(p.EntityID, e.ID)));
232
+ // A normalized Set, not a nested UUIDsEqual scan: every entity x every permission row.
233
+ const entitiesWithPermissions = new Set(existingPermissions.map(p => NormalizeUUID(p.EntityID)));
234
+ const entitiesWithNoPermissions = md.Entities.filter(e => !entitiesWithPermissions.has(NormalizeUUID(e.ID)));
215
235
  for (const e of entitiesWithNoPermissions) {
216
236
  const p = await md.GetEntityObject('MJ: Entity Permissions');
217
237
  await p.LoadFromData({
@@ -226,7 +246,7 @@ export class EntityPermissionsGridComponent extends BaseAngularComponent {
226
246
  });
227
247
  existingPermissions.push(p);
228
248
  }
229
- this.permissions = existingPermissions.sort((a, b) => a.Entity.localeCompare(b.Entity));
249
+ this.Permissions = existingPermissions.sort((a, b) => a.Entity.localeCompare(b.Entity));
230
250
  }
231
251
  }
232
252
  else {
@@ -246,18 +266,22 @@ export class EntityPermissionsGridComponent extends BaseAngularComponent {
246
266
  this.roleNameMap.set(NormalizeUUID(r.ID), r.Name);
247
267
  }
248
268
  }
249
- getRoleName(roleID) {
269
+ GetRoleName(roleID) {
250
270
  if (!roleID)
251
271
  return '';
252
272
  return this.roleNameMap.get(NormalizeUUID(roleID)) ?? '';
253
273
  }
254
- async savePermissions() {
274
+ /** @deprecated Use {@link GetRoleName}. */
275
+ getRoleName(roleID) {
276
+ return this.GetRoleName(roleID);
277
+ }
278
+ async SavePermissions() {
255
279
  if (this.NumDirtyPermissions > 0) {
256
280
  // iterate through each permisison and for the ones that are dirty, add to transaction group then commit at once
257
281
  const md = this.ProviderToUse;
258
282
  const tg = await md.CreateTransactionGroup();
259
283
  let itemCount = 0;
260
- for (const p of this.permissions) {
284
+ for (const p of this.Permissions) {
261
285
  if (this.IsPermissionReallyDirty(p)) {
262
286
  p.TransactionGroup = tg;
263
287
  itemCount++;
@@ -268,18 +292,26 @@ export class EntityPermissionsGridComponent extends BaseAngularComponent {
268
292
  await tg.Submit();
269
293
  }
270
294
  }
271
- async cancelEdit() {
295
+ /** @deprecated Use {@link SavePermissions}. */
296
+ async savePermissions() {
297
+ return this.SavePermissions();
298
+ }
299
+ async CancelEdit() {
272
300
  if (this.NumDirtyPermissions > 0) {
273
301
  // go through and revert each permission that is REALLY dirty
274
- this.permissions.forEach(p => {
302
+ this.Permissions.forEach(p => {
275
303
  if (this.IsPermissionReallyDirty(p)) {
276
304
  p.Revert();
277
305
  }
278
306
  });
279
307
  }
280
308
  }
309
+ /** @deprecated Use {@link CancelEdit}. */
310
+ async cancelEdit() {
311
+ return this.CancelEdit();
312
+ }
281
313
  get NumDirtyPermissions() {
282
- return this.permissions.filter(p => this.IsPermissionReallyDirty(p)).length;
314
+ return this.Permissions.filter(p => this.IsPermissionReallyDirty(p)).length;
283
315
  }
284
316
  IsPermissionReallyDirty(p) {
285
317
  if (!p.Dirty)
@@ -289,11 +321,11 @@ export class EntityPermissionsGridComponent extends BaseAngularComponent {
289
321
  else
290
322
  return p.CanRead || p.CanCreate || p.CanUpdate || p.CanDelete; // if we have a new record, only consider it dirty if at least one permission is true
291
323
  }
292
- flipAllPermissions(type) {
324
+ FlipAllPermissions(type) {
293
325
  // first, figure out what we have the majority of, if we have more ON, then we will flip to OFF, otherwise we will flip to ON
294
326
  let onCount = 0;
295
327
  let offCount = 0;
296
- this.permissions.forEach(p => {
328
+ this.Permissions.forEach(p => {
297
329
  if (type === 'Read') {
298
330
  if (p.CanRead)
299
331
  onCount++;
@@ -321,7 +353,7 @@ export class EntityPermissionsGridComponent extends BaseAngularComponent {
321
353
  });
322
354
  const value = offCount > onCount;
323
355
  // now set the permission for each permission record
324
- for (const p of this.permissions) {
356
+ for (const p of this.Permissions) {
325
357
  switch (type) {
326
358
  case 'Read':
327
359
  p.CanRead = value;
@@ -336,37 +368,49 @@ export class EntityPermissionsGridComponent extends BaseAngularComponent {
336
368
  p.CanDelete = value;
337
369
  break;
338
370
  }
339
- this.flipPermission(undefined, p, type, false); // call this function but tell it to NOT actually flip the permission, just to fire the event
371
+ this.FlipPermission(undefined, p, type, false); // call this function but tell it to NOT actually flip the permission, just to fire the event
340
372
  }
341
373
  }
342
- revertRow(event, permission) {
374
+ /** @deprecated Use {@link FlipAllPermissions}. */
375
+ flipAllPermissions(type) {
376
+ return this.FlipAllPermissions(type);
377
+ }
378
+ RevertRow(event, permission) {
343
379
  if (this.IsPermissionReallyDirty(permission)) {
344
380
  permission.Revert();
345
381
  event.stopPropagation(); // don't bubble up to the parent row because that will do something else...
346
382
  }
347
383
  }
348
- flipRow(permission) {
384
+ /** @deprecated Use {@link RevertRow}. */
385
+ revertRow(event, permission) {
386
+ return this.RevertRow(event, permission);
387
+ }
388
+ FlipRow(permission) {
349
389
  // if 2 or more are on, flip all to off, otherwise flip all to on
350
390
  const onCount = (permission.CanRead ? 1 : 0) + (permission.CanCreate ? 1 : 0) + (permission.CanUpdate ? 1 : 0) + (permission.CanDelete ? 1 : 0);
351
391
  const newValue = onCount < 2;
352
392
  if (permission.CanRead !== newValue) {
353
393
  permission.CanRead = newValue;
354
- this.flipPermission(undefined, permission, 'Read', false); // fire the event but don't actually flip the permission
394
+ this.FlipPermission(undefined, permission, 'Read', false); // fire the event but don't actually flip the permission
355
395
  }
356
396
  if (permission.CanCreate !== newValue) {
357
397
  permission.CanCreate = newValue;
358
- this.flipPermission(undefined, permission, 'Create', false); // fire the event but don't actually flip the permission
398
+ this.FlipPermission(undefined, permission, 'Create', false); // fire the event but don't actually flip the permission
359
399
  }
360
400
  if (permission.CanUpdate !== newValue) {
361
401
  permission.CanUpdate = newValue;
362
- this.flipPermission(undefined, permission, 'Update', false); // fire the event but don't actually flip the permission
402
+ this.FlipPermission(undefined, permission, 'Update', false); // fire the event but don't actually flip the permission
363
403
  }
364
404
  if (permission.CanDelete !== newValue) {
365
405
  permission.CanDelete = newValue;
366
- this.flipPermission(undefined, permission, 'Delete', false); // fire the event but don't actually flip the permission
406
+ this.FlipPermission(undefined, permission, 'Delete', false); // fire the event but don't actually flip the permission
367
407
  }
368
408
  }
369
- flipPermission(event, permission, type, flipPermission) {
409
+ /** @deprecated Use {@link FlipRow}. */
410
+ flipRow(permission) {
411
+ return this.FlipRow(permission);
412
+ }
413
+ FlipPermission(event, permission, type, flipPermission) {
370
414
  if (flipPermission) {
371
415
  switch (type) {
372
416
  case 'Read':
@@ -395,6 +439,10 @@ export class EntityPermissionsGridComponent extends BaseAngularComponent {
395
439
  if (!flipPermission && event)
396
440
  event.stopPropagation();
397
441
  }
442
+ /** @deprecated Use {@link FlipPermission}. */
443
+ flipPermission(event, permission, type, flipPermission) {
444
+ return this.FlipPermission(event, permission, type, flipPermission);
445
+ }
398
446
  static ɵfac = function EntityPermissionsGridComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || EntityPermissionsGridComponent)(); };
399
447
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: EntityPermissionsGridComponent, selectors: [["mj-entity-permissions-grid"]], inputs: { Mode: "Mode", EntityName: "EntityName", RoleName: "RoleName", BottomMargin: "BottomMargin" }, outputs: { PermissionChanged: "PermissionChanged" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 7, vars: 4, consts: [["mjButton", "", 3, "click", "disabled"], [1, "grid"], ["size", "medium", 3, "showText"], [3, "click"], [3, "ngClass"], [1, "permission-left-col", 3, "click"], [1, "fa-solid", "fa-arrow-rotate-left"], ["type", "checkbox", 3, "ngModelChange", "click", "ngModel"], [1, "fa-solid", "fa-arrow-rotate-left", 3, "click"]], template: function EntityPermissionsGridComponent_Template(rf, ctx) { if (rf & 1) {
400
448
  i0.ɵɵelementStart(0, "div");
@@ -1 +1 @@
1
- {"version":3,"file":"entity-permissions-grid.component.js","sourceRoot":"","sources":["../../../src/lib/grid/entity-permissions-grid.component.ts","../../../src/lib/grid/entity-permissions-grid.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Output, EventEmitter, OnInit, Input, SimpleChanges, OnChanges } from '@angular/core';\n\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJEntityPermissionEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport type EntityPermissionChangedEvent = {\n EntityName: string,\n RoleID: string\n PermissionTypeChanged: 'Read' | 'Create' | 'Update' | 'Delete'\n Value: boolean\n Cancel: boolean\n}\n \n@Component({\n standalone: false,\n selector: 'mj-entity-permissions-grid',\n templateUrl: './entity-permissions-grid.component.html',\n styleUrls: ['./entity-permissions-grid.component.css']\n})\nexport class EntityPermissionsGridComponent extends BaseAngularComponent implements OnInit, OnChanges {\n @Input() Mode: 'Entity' | 'Role' = 'Entity';\n @Input() EntityName!: string; // used when Mode is 'Entity'\n @Input() RoleName!: string; // used when Mode is 'Role'\n @Input() BottomMargin: number = 0;\n\n @Output() PermissionChanged = new EventEmitter<EntityPermissionChangedEvent>();\n\n public permissions: MJEntityPermissionEntity[] = [];\n public gridHeight: number = 750;\n public isLoading: boolean = false;\n\n /**\n * Role-name lookup keyed by NormalizeUUID(roleID). Built once when roles are\n * available (data load) so {@link getRoleName} is an O(1) Map read per table\n * row instead of an O(roles) UUIDsEqual scan over `md.Roles` every CD cycle.\n */\n private roleNameMap = new Map<string, string>();\n\n constructor() {\n super();\n }\n\n ngOnInit(): void {\n this.Refresh()\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.EntityName && !changes.EntityName.isFirstChange()) {\n // If EntityName has changed and it's not the first change (initialization)\n this.Refresh();\n }\n }\n\n ValidateInputs() {\n if (this.Mode === 'Entity' && (!this.EntityName || this.EntityName.length === 0))\n throw new Error(\"EntityName is required when Mode is 'Entity'\")\n if (this.Mode === 'Role' && (!this.RoleName || this.RoleName.length === 0))\n throw new Error(\"RoleName is required when Mode is 'Role'\") \n }\n async Refresh() { \n this.ValidateInputs();\n const startTime = new Date().getTime();\n this.isLoading = true\n\n const md = this.ProviderToUse;\n this.buildRoleNameMap();\n const entity = md.Entities.find(e => e.Name === this.EntityName);\n if (this.Mode === 'Entity' && !entity)\n throw new Error(\"Entity not found: \" + this.EntityName)\n\n const r = md.Roles.find(r => r.Name === this.RoleName);\n if (this.Mode === 'Role' && !r)\n throw new Error(\"Role not found: \" + this.RoleName)\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter: string = this.Mode === 'Entity' ? `EntityID='${entity!.ID}'` : `RoleName='${r?.Name}'`;\n const result = await rv.RunView({\n EntityName: 'MJ: Entity Permissions',\n ExtraFilter: filter,\n OrderBy: 'RoleName ASC, Entity ASC',\n ResultType: 'entity_object'\n })\n if (result.Success) {\n // we have all of the saved permissions now\n // the post-process we need to do now is to see if there are any roles that don't have any existing permissions and if so, we need to create \n // new permission records for them. We won't actually consider those \"Dirty\" and save those unless the user actually selects one or more\n // to turn on, we are just doing this to make the grid easy to manage from the user perspective.\n const existingPermissions = <MJEntityPermissionEntity[]>result.Results;\n const roles = md.Roles;\n\n if (this.Mode === 'Entity') {\n const rolesWithNoPermissions = roles.filter(r => !existingPermissions.some(p => UUIDsEqual(p.RoleID, r.ID)));\n for (const r of rolesWithNoPermissions) {\n const p = await md.GetEntityObject<MJEntityPermissionEntity>('MJ: Entity Permissions')\n \n await p.LoadFromData({\n ID: null,\n Entity: entity!.Name,\n EntityID: entity!.ID,\n RoleID: r!.ID,\n CanRead: false,\n CanCreate: false,\n CanUpdate: false,\n CanDelete: false\n });\n existingPermissions.push(p);\n }\n this.permissions = existingPermissions;\n }\n else if (this.Mode === 'Role') {\n // for the mode of Role, that means we want to show all entities and their permissions for the given role\n const entitiesWithNoPermissions = md.Entities.filter(e => !existingPermissions.some(p => UUIDsEqual(p.EntityID, e.ID)));\n for (const e of entitiesWithNoPermissions) {\n const p = await md.GetEntityObject<MJEntityPermissionEntity>('MJ: Entity Permissions')\n \n await p.LoadFromData({\n ID: null,\n Entity: e.Name,\n EntityID: e.ID,\n RoleName: r!.Name,\n CanRead: false,\n CanCreate: false,\n CanUpdate: false,\n CanDelete: false\n });\n existingPermissions.push(p);\n }\n this.permissions = existingPermissions.sort((a, b) => a.Entity!.localeCompare(b.Entity!)); \n }\n }\n else {\n throw new Error(\"Error loading entity permissions: \" + result.ErrorMessage)\n }\n this.isLoading = false\n }\n \n\n /**\n * Populates {@link roleNameMap} from the provider's role list. Called on data\n * load so the per-row template binding {@link getRoleName} never scans\n * `md.Roles` during change detection.\n */\n private buildRoleNameMap(): void {\n const md = this.ProviderToUse;\n this.roleNameMap.clear();\n for (const r of md.Roles) {\n this.roleNameMap.set(NormalizeUUID(r.ID), r.Name);\n }\n }\n\n public getRoleName(roleID: string): string {\n if (!roleID) return '';\n return this.roleNameMap.get(NormalizeUUID(roleID)) ?? '';\n }\n \n public async savePermissions() {\n if (this.NumDirtyPermissions > 0) {\n // iterate through each permisison and for the ones that are dirty, add to transaction group then commit at once\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n let itemCount: number = 0;\n for (const p of this.permissions) {\n if (this.IsPermissionReallyDirty(p)) {\n p.TransactionGroup = tg;\n itemCount++;\n await p.Save(); \n }\n }\n if (itemCount > 0)\n await tg.Submit();\n }\n }\n\n public async cancelEdit() {\n if (this.NumDirtyPermissions > 0) {\n // go through and revert each permission that is REALLY dirty\n this.permissions.forEach(p => {\n if (this.IsPermissionReallyDirty(p)) {\n p.Revert();\n }\n })\n }\n }\n\n public get NumDirtyPermissions(): number {\n return this.permissions.filter(p => this.IsPermissionReallyDirty(p)).length;\n }\n\n protected IsPermissionReallyDirty(p: MJEntityPermissionEntity): boolean {\n if (!p.Dirty)\n return false;\n else if (p.IsSaved)\n return true;\n else\n return p.CanRead || p.CanCreate || p.CanUpdate || p.CanDelete; // if we have a new record, only consider it dirty if at least one permission is true\n }\n\n public flipAllPermissions(type: 'Read' | 'Create' | 'Update' | 'Delete') {\n // first, figure out what we have the majority of, if we have more ON, then we will flip to OFF, otherwise we will flip to ON\n let onCount = 0;\n let offCount = 0;\n this.permissions.forEach(p => {\n if (type === 'Read') {\n if (p.CanRead)\n onCount++;\n else\n offCount++;\n }\n else if (type === 'Create') {\n if (p.CanCreate)\n onCount++;\n else\n offCount++;\n }\n else if (type === 'Update') {\n if (p.CanUpdate)\n onCount++;\n else\n offCount++;\n }\n else if (type === 'Delete') {\n if (p.CanDelete)\n onCount++;\n else\n offCount++;\n }\n })\n const value = offCount > onCount;\n\n // now set the permission for each permission record\n for (const p of this.permissions) {\n switch (type) {\n case 'Read':\n p.CanRead = value;\n break;\n case 'Create':\n p.CanCreate = value;\n break;\n case 'Update':\n p.CanUpdate = value;\n break;\n case 'Delete':\n p.CanDelete = value;\n break;\n }\n this.flipPermission(undefined, p, type, false); // call this function but tell it to NOT actually flip the permission, just to fire the event\n }\n }\n\n public revertRow(event: MouseEvent, permission: MJEntityPermissionEntity) {\n if (this.IsPermissionReallyDirty(permission)) {\n permission.Revert();\n event.stopPropagation(); // don't bubble up to the parent row because that will do something else...\n }\n }\n\n public flipRow(permission: MJEntityPermissionEntity) {\n // if 2 or more are on, flip all to off, otherwise flip all to on\n const onCount = (permission.CanRead ? 1 : 0) + (permission.CanCreate ? 1 : 0) + (permission.CanUpdate ? 1 : 0) + (permission.CanDelete ? 1 : 0);\n const newValue = onCount < 2;\n\n if (permission.CanRead !== newValue) {\n permission.CanRead = newValue;\n this.flipPermission(undefined, permission, 'Read', false); // fire the event but don't actually flip the permission\n }\n\n if (permission.CanCreate !== newValue) {\n permission.CanCreate = newValue;\n this.flipPermission(undefined, permission, 'Create', false); // fire the event but don't actually flip the permission\n }\n\n if (permission.CanUpdate !== newValue) {\n permission.CanUpdate = newValue;\n this.flipPermission(undefined, permission, 'Update', false); // fire the event but don't actually flip the permission\n }\n\n if (permission.CanDelete !== newValue) {\n permission.CanDelete = newValue;\n this.flipPermission(undefined, permission, 'Delete', false); // fire the event but don't actually flip the permission\n }\n }\n\n public flipPermission(event: MouseEvent | undefined, permission: MJEntityPermissionEntity, type: 'Read' | 'Create' | 'Update' | 'Delete', flipPermission: boolean) {\n if (flipPermission) {\n switch (type) {\n case 'Read':\n permission.CanRead = !permission.CanRead;\n break;\n case 'Create':\n permission.CanCreate = !permission.CanCreate;\n break;\n case 'Update':\n permission.CanUpdate = !permission.CanUpdate;\n break;\n case 'Delete':\n permission.CanDelete = !permission.CanDelete;\n break;\n }\n }\n // always fire the event\n const value = type === 'Read' ? permission.CanRead : type === 'Create' ? permission.CanCreate : type === 'Update' ? permission.CanUpdate : permission.CanDelete;\n this.PermissionChanged.emit({\n EntityName: this.EntityName,\n RoleID: permission.RoleID!,\n PermissionTypeChanged: type,\n Value: value,\n Cancel: false\n })\n\n if (!flipPermission && event)\n event.stopPropagation();\n }\n}\n","<div>\n @if (isLoading) {\n <div><mj-loading [showText]=\"false\" size=\"medium\"></mj-loading></div>\n }\n <button [disabled]=\"NumDirtyPermissions === 0\" mjButton (click)=\"savePermissions()\">Save</button>\n <button [disabled]=\"NumDirtyPermissions === 0\" mjButton (click)=\"cancelEdit()\">Cancel</button>\n @if (!isLoading) {\n <table class=\"grid\">\n <thead>\n <tr>\n @if (this.Mode==='Entity') {\n <th>Role</th>\n }\n @if (this.Mode==='Role') {\n <th>Entity</th>\n }\n <th (click)=\"flipAllPermissions('Read')\">Read</th>\n <th (click)=\"flipAllPermissions('Create')\">Create</th>\n <th (click)=\"flipAllPermissions('Update')\">Update</th>\n <th (click)=\"flipAllPermissions('Delete')\">Delete</th>\n </tr>\n </thead>\n <tbody>\n @for (permission of permissions; track permission) {\n <tr [ngClass]=\"IsPermissionReallyDirty(permission) ? 'dirty-row' : ''\">\n <td class=\"permission-left-col\" (click)=\"flipRow(permission)\">\n @if(this.Mode === 'Entity') {\n <span>\n {{ getRoleName(permission.RoleID) }}\n </span>\n }\n @else if(this.Mode === 'Role') {\n <span>\n {{ permission.Entity }}\n </span>\n }\n @if(IsPermissionReallyDirty(permission)) {\n <span class=\"fa-solid fa-arrow-rotate-left\" (click)=\"revertRow($event, permission)\"></span>\n }\n </td>\n <td (click)=\"flipPermission($event, permission, 'Read', true)\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.CanRead\" (click)=\"flipPermission($event, permission, 'Read', false)\">\n </td>\n <td (click)=\"flipPermission($event, permission, 'Create', true)\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.CanCreate\" (click)=\"flipPermission($event, permission, 'Create', false)\">\n </td>\n <td (click)=\"flipPermission($event, permission, 'Update', true)\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.CanUpdate\" (click)=\"flipPermission($event, permission, 'Update', false)\">\n </td>\n <td (click)=\"flipPermission($event, permission, 'Delete', true)\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.CanDelete\" (click)=\"flipPermission($event, permission, 'Delete', false)\">\n </td>\n </tr>\n }\n </tbody>\n </table>\n}\n</div>\n"]}
1
+ {"version":3,"file":"entity-permissions-grid.component.js","sourceRoot":"","sources":["../../../src/lib/grid/entity-permissions-grid.component.ts","../../../src/lib/grid/entity-permissions-grid.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Output, EventEmitter, OnInit, Input, SimpleChanges, OnChanges } from '@angular/core';\n\nimport { Metadata, RunView } from '@memberjunction/core';\nimport { MJEntityPermissionEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\n\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nexport type EntityPermissionChangedEvent = {\n EntityName: string,\n RoleID: string\n PermissionTypeChanged: 'Read' | 'Create' | 'Update' | 'Delete'\n Value: boolean\n Cancel: boolean\n}\n \n@Component({\n standalone: false,\n selector: 'mj-entity-permissions-grid',\n templateUrl: './entity-permissions-grid.component.html',\n styleUrls: ['./entity-permissions-grid.component.css']\n})\nexport class EntityPermissionsGridComponent extends BaseAngularComponent implements OnInit, OnChanges {\n @Input() Mode: 'Entity' | 'Role' = 'Entity';\n @Input() EntityName!: string; // used when Mode is 'Entity'\n @Input() RoleName!: string; // used when Mode is 'Role'\n @Input() BottomMargin: number = 0;\n\n @Output() PermissionChanged = new EventEmitter<EntityPermissionChangedEvent>();\n\n public Permissions: MJEntityPermissionEntity[] = [];\n\n /** @deprecated Use {@link Permissions}. */\n public get permissions(): MJEntityPermissionEntity[] {\n return this.Permissions;\n }\n /** @deprecated Use {@link Permissions}. */\n public set permissions(value: MJEntityPermissionEntity[]) {\n this.Permissions = value;\n }\n public GridHeight: number = 750;\n\n /** @deprecated Use {@link GridHeight}. */\n public get gridHeight(): number {\n return this.GridHeight;\n }\n /** @deprecated Use {@link GridHeight}. */\n public set gridHeight(value: number) {\n this.GridHeight = value;\n }\n public isLoading: boolean = false;\n\n /**\n * Role-name lookup keyed by NormalizeUUID(roleID). Built once when roles are\n * available (data load) so {@link getRoleName} is an O(1) Map read per table\n * row instead of an O(roles) UUIDsEqual scan over `md.Roles` every CD cycle.\n */\n private roleNameMap = new Map<string, string>();\n\n constructor() {\n super();\n }\n\n ngOnInit(): void {\n this.Refresh()\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.EntityName && !changes.EntityName.isFirstChange()) {\n // If EntityName has changed and it's not the first change (initialization)\n this.Refresh();\n }\n }\n\n ValidateInputs() {\n if (this.Mode === 'Entity' && (!this.EntityName || this.EntityName.length === 0))\n throw new Error(\"EntityName is required when Mode is 'Entity'\")\n if (this.Mode === 'Role' && (!this.RoleName || this.RoleName.length === 0))\n throw new Error(\"RoleName is required when Mode is 'Role'\") \n }\n async Refresh() { \n this.ValidateInputs();\n const startTime = new Date().getTime();\n this.isLoading = true\n\n const md = this.ProviderToUse;\n this.buildRoleNameMap();\n const entity = md.Entities.find(e => e.Name === this.EntityName);\n if (this.Mode === 'Entity' && !entity)\n throw new Error(\"Entity not found: \" + this.EntityName)\n\n const r = md.Roles.find(r => r.Name === this.RoleName);\n if (this.Mode === 'Role' && !r)\n throw new Error(\"Role not found: \" + this.RoleName)\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter: string = this.Mode === 'Entity' ? `EntityID='${entity!.ID}'` : `RoleName='${r?.Name}'`;\n const result = await rv.RunView({\n EntityName: 'MJ: Entity Permissions',\n ExtraFilter: filter,\n OrderBy: 'RoleName ASC, Entity ASC',\n ResultType: 'entity_object'\n })\n if (result.Success) {\n // we have all of the saved permissions now\n // the post-process we need to do now is to see if there are any roles that don't have any existing permissions and if so, we need to create \n // new permission records for them. We won't actually consider those \"Dirty\" and save those unless the user actually selects one or more\n // to turn on, we are just doing this to make the grid easy to manage from the user perspective.\n const existingPermissions = <MJEntityPermissionEntity[]>result.Results;\n const roles = md.Roles;\n\n if (this.Mode === 'Entity') {\n // A normalized Set, not a nested UUIDsEqual scan: roles x permissions grows with both.\n const rolesWithPermissions = new Set(existingPermissions.map(p => NormalizeUUID(p.RoleID)));\n const rolesWithNoPermissions = roles.filter(r => !rolesWithPermissions.has(NormalizeUUID(r.ID)));\n for (const r of rolesWithNoPermissions) {\n const p = await md.GetEntityObject<MJEntityPermissionEntity>('MJ: Entity Permissions')\n \n await p.LoadFromData({\n ID: null,\n Entity: entity!.Name,\n EntityID: entity!.ID,\n RoleID: r!.ID,\n CanRead: false,\n CanCreate: false,\n CanUpdate: false,\n CanDelete: false\n });\n existingPermissions.push(p);\n }\n this.Permissions = existingPermissions;\n }\n else if (this.Mode === 'Role') {\n // for the mode of Role, that means we want to show all entities and their permissions for the given role\n // A normalized Set, not a nested UUIDsEqual scan: every entity x every permission row.\n const entitiesWithPermissions = new Set(existingPermissions.map(p => NormalizeUUID(p.EntityID)));\n const entitiesWithNoPermissions = md.Entities.filter(e => !entitiesWithPermissions.has(NormalizeUUID(e.ID)));\n for (const e of entitiesWithNoPermissions) {\n const p = await md.GetEntityObject<MJEntityPermissionEntity>('MJ: Entity Permissions')\n \n await p.LoadFromData({\n ID: null,\n Entity: e.Name,\n EntityID: e.ID,\n RoleName: r!.Name,\n CanRead: false,\n CanCreate: false,\n CanUpdate: false,\n CanDelete: false\n });\n existingPermissions.push(p);\n }\n this.Permissions = existingPermissions.sort((a, b) => a.Entity!.localeCompare(b.Entity!)); \n }\n }\n else {\n throw new Error(\"Error loading entity permissions: \" + result.ErrorMessage)\n }\n this.isLoading = false\n }\n \n\n /**\n * Populates {@link roleNameMap} from the provider's role list. Called on data\n * load so the per-row template binding {@link getRoleName} never scans\n * `md.Roles` during change detection.\n */\n private buildRoleNameMap(): void {\n const md = this.ProviderToUse;\n this.roleNameMap.clear();\n for (const r of md.Roles) {\n this.roleNameMap.set(NormalizeUUID(r.ID), r.Name);\n }\n }\n\n public GetRoleName(roleID: string): string {\n if (!roleID) return '';\n return this.roleNameMap.get(NormalizeUUID(roleID)) ?? '';\n }\n\n /** @deprecated Use {@link GetRoleName}. */\n public getRoleName(roleID: string): string {\n return this.GetRoleName(roleID);\n }\n \n public async SavePermissions() {\n if (this.NumDirtyPermissions > 0) {\n // iterate through each permisison and for the ones that are dirty, add to transaction group then commit at once\n const md = this.ProviderToUse;\n const tg = await md.CreateTransactionGroup();\n let itemCount: number = 0;\n for (const p of this.Permissions) {\n if (this.IsPermissionReallyDirty(p)) {\n p.TransactionGroup = tg;\n itemCount++;\n await p.Save(); \n }\n }\n if (itemCount > 0)\n await tg.Submit();\n }\n }\n\n /** @deprecated Use {@link SavePermissions}. */\n public async savePermissions() {\n return this.SavePermissions();\n }\n\n public async CancelEdit() {\n if (this.NumDirtyPermissions > 0) {\n // go through and revert each permission that is REALLY dirty\n this.Permissions.forEach(p => {\n if (this.IsPermissionReallyDirty(p)) {\n p.Revert();\n }\n })\n }\n }\n\n /** @deprecated Use {@link CancelEdit}. */\n public async cancelEdit() {\n return this.CancelEdit();\n }\n\n public get NumDirtyPermissions(): number {\n return this.Permissions.filter(p => this.IsPermissionReallyDirty(p)).length;\n }\n\n protected IsPermissionReallyDirty(p: MJEntityPermissionEntity): boolean {\n if (!p.Dirty)\n return false;\n else if (p.IsSaved)\n return true;\n else\n return p.CanRead || p.CanCreate || p.CanUpdate || p.CanDelete; // if we have a new record, only consider it dirty if at least one permission is true\n }\n\n public FlipAllPermissions(type: 'Read' | 'Create' | 'Update' | 'Delete') {\n // first, figure out what we have the majority of, if we have more ON, then we will flip to OFF, otherwise we will flip to ON\n let onCount = 0;\n let offCount = 0;\n this.Permissions.forEach(p => {\n if (type === 'Read') {\n if (p.CanRead)\n onCount++;\n else\n offCount++;\n }\n else if (type === 'Create') {\n if (p.CanCreate)\n onCount++;\n else\n offCount++;\n }\n else if (type === 'Update') {\n if (p.CanUpdate)\n onCount++;\n else\n offCount++;\n }\n else if (type === 'Delete') {\n if (p.CanDelete)\n onCount++;\n else\n offCount++;\n }\n })\n const value = offCount > onCount;\n\n // now set the permission for each permission record\n for (const p of this.Permissions) {\n switch (type) {\n case 'Read':\n p.CanRead = value;\n break;\n case 'Create':\n p.CanCreate = value;\n break;\n case 'Update':\n p.CanUpdate = value;\n break;\n case 'Delete':\n p.CanDelete = value;\n break;\n }\n this.FlipPermission(undefined, p, type, false); // call this function but tell it to NOT actually flip the permission, just to fire the event\n }\n }\n\n /** @deprecated Use {@link FlipAllPermissions}. */\n public flipAllPermissions(type: 'Read' | 'Create' | 'Update' | 'Delete') {\n return this.FlipAllPermissions(type);\n }\n\n public RevertRow(event: MouseEvent, permission: MJEntityPermissionEntity) {\n if (this.IsPermissionReallyDirty(permission)) {\n permission.Revert();\n event.stopPropagation(); // don't bubble up to the parent row because that will do something else...\n }\n }\n\n /** @deprecated Use {@link RevertRow}. */\n public revertRow(event: MouseEvent, permission: MJEntityPermissionEntity) {\n return this.RevertRow(event, permission);\n }\n\n public FlipRow(permission: MJEntityPermissionEntity) {\n // if 2 or more are on, flip all to off, otherwise flip all to on\n const onCount = (permission.CanRead ? 1 : 0) + (permission.CanCreate ? 1 : 0) + (permission.CanUpdate ? 1 : 0) + (permission.CanDelete ? 1 : 0);\n const newValue = onCount < 2;\n\n if (permission.CanRead !== newValue) {\n permission.CanRead = newValue;\n this.FlipPermission(undefined, permission, 'Read', false); // fire the event but don't actually flip the permission\n }\n\n if (permission.CanCreate !== newValue) {\n permission.CanCreate = newValue;\n this.FlipPermission(undefined, permission, 'Create', false); // fire the event but don't actually flip the permission\n }\n\n if (permission.CanUpdate !== newValue) {\n permission.CanUpdate = newValue;\n this.FlipPermission(undefined, permission, 'Update', false); // fire the event but don't actually flip the permission\n }\n\n if (permission.CanDelete !== newValue) {\n permission.CanDelete = newValue;\n this.FlipPermission(undefined, permission, 'Delete', false); // fire the event but don't actually flip the permission\n }\n }\n\n /** @deprecated Use {@link FlipRow}. */\n public flipRow(permission: MJEntityPermissionEntity) {\n return this.FlipRow(permission);\n }\n\n public FlipPermission(event: MouseEvent | undefined, permission: MJEntityPermissionEntity, type: 'Read' | 'Create' | 'Update' | 'Delete', flipPermission: boolean) {\n if (flipPermission) {\n switch (type) {\n case 'Read':\n permission.CanRead = !permission.CanRead;\n break;\n case 'Create':\n permission.CanCreate = !permission.CanCreate;\n break;\n case 'Update':\n permission.CanUpdate = !permission.CanUpdate;\n break;\n case 'Delete':\n permission.CanDelete = !permission.CanDelete;\n break;\n }\n }\n // always fire the event\n const value = type === 'Read' ? permission.CanRead : type === 'Create' ? permission.CanCreate : type === 'Update' ? permission.CanUpdate : permission.CanDelete;\n this.PermissionChanged.emit({\n EntityName: this.EntityName,\n RoleID: permission.RoleID!,\n PermissionTypeChanged: type,\n Value: value,\n Cancel: false\n })\n\n if (!flipPermission && event)\n event.stopPropagation();\n }\n\n /** @deprecated Use {@link FlipPermission}. */\n public flipPermission(event: MouseEvent | undefined, permission: MJEntityPermissionEntity, type: 'Read' | 'Create' | 'Update' | 'Delete', flipPermission: boolean) {\n return this.FlipPermission(event, permission, type, flipPermission);\n }\n}\n","<div>\n @if (isLoading) {\n <div><mj-loading [showText]=\"false\" size=\"medium\"></mj-loading></div>\n }\n <button [disabled]=\"NumDirtyPermissions === 0\" mjButton (click)=\"savePermissions()\">Save</button>\n <button [disabled]=\"NumDirtyPermissions === 0\" mjButton (click)=\"cancelEdit()\">Cancel</button>\n @if (!isLoading) {\n <table class=\"grid\">\n <thead>\n <tr>\n @if (this.Mode==='Entity') {\n <th>Role</th>\n }\n @if (this.Mode==='Role') {\n <th>Entity</th>\n }\n <th (click)=\"flipAllPermissions('Read')\">Read</th>\n <th (click)=\"flipAllPermissions('Create')\">Create</th>\n <th (click)=\"flipAllPermissions('Update')\">Update</th>\n <th (click)=\"flipAllPermissions('Delete')\">Delete</th>\n </tr>\n </thead>\n <tbody>\n @for (permission of permissions; track permission) {\n <tr [ngClass]=\"IsPermissionReallyDirty(permission) ? 'dirty-row' : ''\">\n <td class=\"permission-left-col\" (click)=\"flipRow(permission)\">\n @if(this.Mode === 'Entity') {\n <span>\n {{ getRoleName(permission.RoleID) }}\n </span>\n }\n @else if(this.Mode === 'Role') {\n <span>\n {{ permission.Entity }}\n </span>\n }\n @if(IsPermissionReallyDirty(permission)) {\n <span class=\"fa-solid fa-arrow-rotate-left\" (click)=\"revertRow($event, permission)\"></span>\n }\n </td>\n <td (click)=\"flipPermission($event, permission, 'Read', true)\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.CanRead\" (click)=\"flipPermission($event, permission, 'Read', false)\">\n </td>\n <td (click)=\"flipPermission($event, permission, 'Create', true)\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.CanCreate\" (click)=\"flipPermission($event, permission, 'Create', false)\">\n </td>\n <td (click)=\"flipPermission($event, permission, 'Update', true)\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.CanUpdate\" (click)=\"flipPermission($event, permission, 'Update', false)\">\n </td>\n <td (click)=\"flipPermission($event, permission, 'Delete', true)\">\n <input type=\"checkbox\" [(ngModel)]=\"permission.CanDelete\" (click)=\"flipPermission($event, permission, 'Delete', false)\">\n </td>\n </tr>\n }\n </tbody>\n </table>\n}\n</div>\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-entity-permissions",
3
- "version": "6.2.0-edge.0",
3
+ "version": "6.2.0-edge.2",
4
4
  "description": "MemberJunction: Angular components for displaying/editing permissions for an entity, and related components.",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -13,7 +13,7 @@
13
13
  "devDependencies": {
14
14
  "@angular/compiler": "21.2.22",
15
15
  "@angular/compiler-cli": "21.2.22",
16
- "@memberjunction/ng-test-utils": "6.2.0-edge.0"
16
+ "@memberjunction/ng-test-utils": "6.2.0-edge.2"
17
17
  },
18
18
  "peerDependencies": {
19
19
  "@angular/common": "^21.2.22",
@@ -21,13 +21,13 @@
21
21
  "@angular/forms": "^21.2.22"
22
22
  },
23
23
  "dependencies": {
24
- "@memberjunction/core": "6.2.0-edge.0",
25
- "@memberjunction/core-entities": "6.2.0-edge.0",
26
- "@memberjunction/global": "6.2.0-edge.0",
27
- "@memberjunction/ng-base-types": "6.2.0-edge.0",
28
- "@memberjunction/ng-container-directives": "6.2.0-edge.0",
29
- "@memberjunction/ng-shared-generic": "6.2.0-edge.0",
30
- "@memberjunction/ng-ui-components": "6.2.0-edge.0",
24
+ "@memberjunction/core": "6.2.0-edge.2",
25
+ "@memberjunction/core-entities": "6.2.0-edge.2",
26
+ "@memberjunction/global": "6.2.0-edge.2",
27
+ "@memberjunction/ng-base-types": "6.2.0-edge.2",
28
+ "@memberjunction/ng-container-directives": "6.2.0-edge.2",
29
+ "@memberjunction/ng-shared-generic": "6.2.0-edge.2",
30
+ "@memberjunction/ng-ui-components": "6.2.0-edge.2",
31
31
  "tslib": "^2.8.1"
32
32
  },
33
33
  "sideEffects": false,