@memberjunction/ng-resource-permissions 6.1.0-edge.4 → 6.1.0-edge.6

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.
@@ -166,7 +166,7 @@ export class AvailableResourcesComponent extends BaseAngularComponent {
166
166
  } if (rf & 2) {
167
167
  i0.ɵɵadvance();
168
168
  i0.ɵɵconditional(ctx.User ? 1 : -1);
169
- } }, dependencies: [i1.AgGridAngular], styles: ["\n\n.container[_ngcontent-%COMP%] {\n max-width: 100%;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\nh3[_ngcontent-%COMP%] {\n margin-bottom: var(--mj-space-4);\n font-size: var(--mj-text-2xl);\n color: var(--mj-text-primary);\n}\n\n\n\n.resources-grid[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-sm);\n}"] });
169
+ } }, dependencies: [i1.AgGridAngular], styles: ["\n.container[_ngcontent-%COMP%] {\n max-width: 100%;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\nh3[_ngcontent-%COMP%] {\n margin-bottom: var(--mj-space-4);\n font-size: var(--mj-text-2xl);\n color: var(--mj-text-primary);\n}\n\n\n.resources-grid[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-sm);\n}"] });
170
170
  }
171
171
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AvailableResourcesComponent, [{
172
172
  type: Component,
@@ -131,7 +131,7 @@ export class RequestResourceAccessComponent extends BaseAngularComponent {
131
131
  i0.ɵɵconditional(ctx.ShowPermissionLevelDropdown && !ctx.AfterRequest ? 10 : -1);
132
132
  i0.ɵɵadvance();
133
133
  i0.ɵɵconditional(!ctx.AfterRequest ? 11 : -1);
134
- } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective], styles: [".request-access-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: var(--mj-space-5);\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n max-width: 400px;\n margin: var(--mj-space-2-5);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.request-icon[_ngcontent-%COMP%] {\n font-size: 48px;\n \n\n color: var(--mj-status-warning);\n margin-bottom: var(--mj-space-2-5);\n}\n\n.request-info[_ngcontent-%COMP%] {\n text-align: center;\n margin-bottom: var(--mj-space-5);\n}\n\n.request-info[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: var(--mj-text-2xl);\n margin: 0;\n color: var(--mj-text-primary);\n}\n\n.request-info[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n color: var(--mj-text-secondary);\n margin-top: var(--mj-space-2);\n}\n\n.request-actions[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n}\n\n.request-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n background-color: var(--mj-status-success);\n color: var(--mj-text-inverse);\n padding: var(--mj-space-2-5) var(--mj-space-5);\n border: none;\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-base);\n cursor: pointer;\n transition: var(--mj-transition-base);\n font-family: var(--mj-font-family);\n}\n\n.request-button[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-status-success-text);\n}\n\n.request-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: var(--mj-space-2);\n}\n\n@media (max-width: 600px) {\n .request-access-container[_ngcontent-%COMP%] {\n padding: var(--mj-space-4);\n max-width: 90%;\n }\n\n .request-info[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xl);\n }\n\n .request-info[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n }\n\n .request-button[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n padding: var(--mj-space-2) var(--mj-space-4);\n }\n}"] });
134
+ } }, dependencies: [i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.MJButtonDirective], styles: [".request-access-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: var(--mj-space-5);\n background-color: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n max-width: 400px;\n margin: var(--mj-space-2-5);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.request-icon[_ngcontent-%COMP%] {\n font-size: 48px;\n \n color: var(--mj-status-warning);\n margin-bottom: var(--mj-space-2-5);\n}\n\n.request-info[_ngcontent-%COMP%] {\n text-align: center;\n margin-bottom: var(--mj-space-5);\n}\n\n.request-info[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: var(--mj-text-2xl);\n margin: 0;\n color: var(--mj-text-primary);\n}\n\n.request-info[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: var(--mj-text-base);\n color: var(--mj-text-secondary);\n margin-top: var(--mj-space-2);\n}\n\n.request-actions[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n}\n\n.request-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n background-color: var(--mj-status-success);\n color: var(--mj-text-inverse);\n padding: var(--mj-space-2-5) var(--mj-space-5);\n border: none;\n border-radius: var(--mj-radius-sm);\n font-size: var(--mj-text-base);\n cursor: pointer;\n transition: var(--mj-transition-base);\n font-family: var(--mj-font-family);\n}\n\n.request-button[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-status-success-text);\n}\n\n.request-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: var(--mj-space-2);\n}\n\n@media (max-width: 600px) {\n .request-access-container[_ngcontent-%COMP%] {\n padding: var(--mj-space-4);\n max-width: 90%;\n }\n\n .request-info[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xl);\n }\n\n .request-info[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n }\n\n .request-button[_ngcontent-%COMP%] {\n font-size: var(--mj-text-sm);\n padding: var(--mj-space-2) var(--mj-space-4);\n }\n}"] });
135
135
  }
136
136
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RequestResourceAccessComponent, [{
137
137
  type: Component,
@@ -393,7 +393,7 @@ export class ResourcePermissionsComponent extends BaseAngularComponent {
393
393
  i0.ɵɵconditional(ctx.AllowDeletePermissions ? 13 : -1);
394
394
  i0.ɵɵadvance(2);
395
395
  i0.ɵɵrepeater(ctx.resourcePermissions);
396
- } }, dependencies: [i1.NgControlStatus, i1.NgModel, i2.LoadingComponent, i3.MJButtonDirective, i3.MJDropdownComponent], styles: ["\n\n.container[_ngcontent-%COMP%] {\n max-width: 100%;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n\n\n.table-container[_ngcontent-%COMP%] {\n max-height: 400px;\n \n\n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-sm);\n}\n\n\n\n.resource-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.resource-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-elevated);\n font-weight: var(--mj-font-bold);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.resource-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.resource-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: var(--mj-space-3);\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.resource-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-elevated);\n color: var(--mj-text-secondary);\n}\n\n.resource-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:nth-child(even) {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.resource-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-hover);\n}\n\n\n\nbutton.k-button[_ngcontent-%COMP%] {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n padding: var(--mj-space-1) var(--mj-space-2-5);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n font-family: var(--mj-font-family);\n}\n\nbutton.k-button[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-status-error-text);\n}\n\n.add-permission-label[_ngcontent-%COMP%] {\n margin-left: var(--mj-space-1);\n margin-right: var(--mj-space-1);\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-primary);\n}\n\n.add-permission-section[_ngcontent-%COMP%] {\n margin-top: var(--mj-space-2-5);\n margin-bottom: var(--mj-space-2-5);\n}"] });
396
+ } }, dependencies: [i1.NgControlStatus, i1.NgModel, i2.LoadingComponent, i3.MJButtonDirective, i3.MJDropdownComponent], styles: ["\n.container[_ngcontent-%COMP%] {\n max-width: 100%;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n\n.table-container[_ngcontent-%COMP%] {\n max-height: 400px;\n \n overflow-y: auto;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n box-shadow: var(--mj-shadow-sm);\n}\n\n\n.resource-table[_ngcontent-%COMP%] {\n width: 100%;\n border-collapse: collapse;\n}\n\n.resource-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-elevated);\n font-weight: var(--mj-font-bold);\n position: sticky;\n top: 0;\n z-index: 1;\n}\n\n.resource-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], \n.resource-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%] {\n padding: var(--mj-space-3);\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n color: var(--mj-text-primary);\n}\n\n.resource-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-elevated);\n color: var(--mj-text-secondary);\n}\n\n.resource-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:nth-child(even) {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.resource-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-hover);\n}\n\n\nbutton.k-button[_ngcontent-%COMP%] {\n background-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border: none;\n padding: var(--mj-space-1) var(--mj-space-2-5);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n font-family: var(--mj-font-family);\n}\n\nbutton.k-button[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-status-error-text);\n}\n\n.add-permission-label[_ngcontent-%COMP%] {\n margin-left: var(--mj-space-1);\n margin-right: var(--mj-space-1);\n font-weight: var(--mj-font-bold);\n color: var(--mj-text-primary);\n}\n\n.add-permission-section[_ngcontent-%COMP%] {\n margin-top: var(--mj-space-2-5);\n margin-bottom: var(--mj-space-2-5);\n}"] });
397
397
  }
398
398
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ResourcePermissionsComponent, [{
399
399
  type: Component,
@@ -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,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;;;OAGG;IACH,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAK/E,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;yCA1NZ,0BAA0B;2CAA1B,0BAA0B;CAiPtC"}
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;IAqCtE;;;OAGG;IACH,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAK/E,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;yCA/NZ,0BAA0B;2CAA1B,0BAA0B;CAsPtC"}
@@ -352,10 +352,15 @@ export class UserSharingCenterComponent extends BaseAngularComponent {
352
352
  return;
353
353
  try {
354
354
  const md = this.ProviderToUse;
355
+ // `SharingEntityResolver` is an @Input, so a custom domain can map to any entity — resolve the
356
+ // key against that entity's real primary key column(s) rather than assuming `ID`.
357
+ const entityInfo = md.EntityByName(entityName);
358
+ if (!entityInfo) {
359
+ this.setError(`Entity '${entityName}' for domain '${row.DomainName}' was not found in metadata.`);
360
+ return;
361
+ }
355
362
  const entity = await md.GetEntityObject(entityName, md.CurrentUser);
356
- const key = new CompositeKey();
357
- key.KeyValuePairs.push({ FieldName: 'ID', Value: row.SourceRecordID });
358
- const loaded = await entity.InnerLoad(key);
363
+ const loaded = await entity.InnerLoad(CompositeKey.FromURLSegment(entityInfo, row.SourceRecordID));
359
364
  if (!loaded) {
360
365
  this.setError('Could not load the permission record.');
361
366
  return;
@@ -510,7 +515,7 @@ export class UserSharingCenterComponent extends BaseAngularComponent {
510
515
  i0.ɵɵconditional(ctx.ErrorMessage ? 10 : -1);
511
516
  i0.ɵɵadvance();
512
517
  i0.ɵɵconditional(ctx.ActiveTab === "shared-with-me" ? 11 : 12);
513
- } }, dependencies: [CommonModule, MJEmptyStateComponent, MJAccordionModule, i1.MJAccordionPanelComponent, i1.MJAccordionTitleDirective, i1.MJAccordionBodyDirective, i2.DatePipe], styles: [".user-sharing-center[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 480px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.tabs[_ngcontent-%COMP%] .tab[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n}\n\n.tabs[_ngcontent-%COMP%] .tab[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.tabs[_ngcontent-%COMP%] .tab.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.tabs[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.tabs[_ngcontent-%COMP%] .close[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n font-size: 16px;\n}\n\n.tabs[_ngcontent-%COMP%] .close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.loading[_ngcontent-%COMP%], \n.empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 16px;\n gap: 12px;\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 28px;\n}\n\n.error[_ngcontent-%COMP%] {\n margin: 12px;\n padding: 10px 12px;\n border-radius: 4px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n\n\n\n\n.group-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n width: 18px;\n text-align: center;\n}\n\n.group-name[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\n\n\n.rows[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto auto auto;\n align-items: center;\n gap: 12px;\n padding: 8px 16px 8px 44px;\n background: transparent;\n border: none;\n color: var(--mj-text-primary);\n cursor: pointer;\n text-align: left;\n font-size: 13px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.row.editable[_ngcontent-%COMP%] {\n grid-template-columns: minmax(0, 1fr) auto auto auto auto auto;\n cursor: default;\n}\n\n.row.editable[_ngcontent-%COMP%]:hover {\n background: transparent;\n}\n\n.row[_ngcontent-%COMP%] .resource[_ngcontent-%COMP%] {\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.row[_ngcontent-%COMP%] .resource-type[_ngcontent-%COMP%], \n.row[_ngcontent-%COMP%] .grantee[_ngcontent-%COMP%], \n.row[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%], \n.row[_ngcontent-%COMP%] .expires[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n.row[_ngcontent-%COMP%] .grantee[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 4px;\n}\n\n.row[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: var(--mj-font-mono, monospace);\n font-size: 11px;\n}\n\n.row[_ngcontent-%COMP%] .revoke[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border-radius: 4px;\n border: none;\n background: transparent;\n color: var(--mj-status-error);\n cursor: pointer;\n font-size: 13px;\n}\n\n.row[_ngcontent-%COMP%] .revoke[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}"], changeDetection: 0 });
518
+ } }, dependencies: [CommonModule, MJEmptyStateComponent, MJAccordionModule, i1.MJAccordionPanelComponent, i1.MJAccordionTitleDirective, i1.MJAccordionBodyDirective, i2.DatePipe], styles: [".user-sharing-center[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-width: 480px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.tabs[_ngcontent-%COMP%] .tab[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n border-radius: 4px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n}\n\n.tabs[_ngcontent-%COMP%] .tab[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.tabs[_ngcontent-%COMP%] .tab.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.tabs[_ngcontent-%COMP%] .spacer[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.tabs[_ngcontent-%COMP%] .close[_ngcontent-%COMP%] {\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n font-size: 16px;\n}\n\n.tabs[_ngcontent-%COMP%] .close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.loading[_ngcontent-%COMP%], \n.empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 48px 16px;\n gap: 12px;\n color: var(--mj-text-muted);\n font-size: 14px;\n}\n\n.loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.empty[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 28px;\n}\n\n.error[_ngcontent-%COMP%] {\n margin: 12px;\n padding: 10px 12px;\n border-radius: 4px;\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n border: 1px solid var(--mj-status-error-border);\n font-size: 13px;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n\n\n\n\n\n.group-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n width: 18px;\n text-align: center;\n}\n\n.group-name[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n\n\n.rows[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto auto auto;\n align-items: center;\n gap: 12px;\n padding: 8px 16px 8px 44px;\n background: transparent;\n border: none;\n color: var(--mj-text-primary);\n cursor: pointer;\n text-align: left;\n font-size: 13px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n.row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.row.editable[_ngcontent-%COMP%] {\n grid-template-columns: minmax(0, 1fr) auto auto auto auto auto;\n cursor: default;\n}\n\n.row.editable[_ngcontent-%COMP%]:hover {\n background: transparent;\n}\n\n.row[_ngcontent-%COMP%] .resource[_ngcontent-%COMP%] {\n font-weight: 500;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.row[_ngcontent-%COMP%] .resource-type[_ngcontent-%COMP%], \n.row[_ngcontent-%COMP%] .grantee[_ngcontent-%COMP%], \n.row[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%], \n.row[_ngcontent-%COMP%] .expires[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 12px;\n white-space: nowrap;\n}\n\n.row[_ngcontent-%COMP%] .grantee[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 4px;\n}\n\n.row[_ngcontent-%COMP%] .actions[_ngcontent-%COMP%] {\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n font-family: var(--mj-font-mono, monospace);\n font-size: 11px;\n}\n\n.row[_ngcontent-%COMP%] .revoke[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border-radius: 4px;\n border: none;\n background: transparent;\n color: var(--mj-status-error);\n cursor: pointer;\n font-size: 13px;\n}\n\n.row[_ngcontent-%COMP%] .revoke[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-error) 10%, var(--mj-bg-surface));\n}"], changeDetection: 0 });
514
519
  }
515
520
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(UserSharingCenterComponent, [{
516
521
  type: Component,
@@ -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 NormalizedPermission,\n PermissionAction,\n} from '@memberjunction/core';\nimport { PermissionEngine } from '@memberjunction/core-entities';\nimport { MJAccordionModule, MJDialogAction, MJDialogService, MJEmptyStateComponent } 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, MJEmptyStateComponent, MJAccordionModule],\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 /**\n * Apply the expand/collapse state emitted by the accordion panel for a domain\n * group. OnPush, so an explicit detectChanges() is required to reflect the change.\n */\n OnGroupExpandedChange(group: SharingCenterDomainGroup, expanded: boolean): void {\n group.Expanded = 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 <mj-empty-state class=\"empty\" Size=\"compact\"\n Icon=\"fa-solid fa-inbox\"\n Title=\"Nothing has been shared directly with you yet.\" />\n } @else {\n @for (group of SharedWithMe; track TrackByDomain($index, group)) {\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.Expanded\"\n (ExpandedChange)=\"OnGroupExpandedChange(group, $event)\">\n <ng-template mjAccordionTitle>\n <span class=\"group-icon\"><i [class]=\"group.Icon\"></i></span>\n <span class=\"group-name\">{{ group.DomainName }}</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ group.Rows.length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\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 </ng-template>\n </mj-accordion-panel>\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 <mj-empty-state class=\"empty\" Size=\"compact\"\n Icon=\"fa-solid fa-paper-plane\"\n Title=\"You haven't shared anything with others yet.\" />\n } @else {\n @for (group of SharedByMe; track TrackByDomain($index, group)) {\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.Expanded\"\n (ExpandedChange)=\"OnGroupExpandedChange(group, $event)\">\n <ng-template mjAccordionTitle>\n <span class=\"group-icon\"><i [class]=\"group.Icon\"></i></span>\n <span class=\"group-name\">{{ group.DomainName }}</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ group.Rows.length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\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 </ng-template>\n </mj-accordion-panel>\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":"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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 NormalizedPermission,\n PermissionAction,\n} from '@memberjunction/core';\nimport { PermissionEngine } from '@memberjunction/core-entities';\nimport { MJAccordionModule, MJDialogAction, MJDialogService, MJEmptyStateComponent } 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, MJEmptyStateComponent, MJAccordionModule],\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 // `SharingEntityResolver` is an @Input, so a custom domain can map to any entity — resolve the\n // key against that entity's real primary key column(s) rather than assuming `ID`.\n const entityInfo = md.EntityByName(entityName);\n if (!entityInfo) {\n this.setError(`Entity '${entityName}' for domain '${row.DomainName}' was not found in metadata.`);\n return;\n }\n const entity = await md.GetEntityObject<BaseEntity>(entityName, md.CurrentUser);\n const loaded = await entity.InnerLoad(CompositeKey.FromURLSegment(entityInfo, row.SourceRecordID));\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 /**\n * Apply the expand/collapse state emitted by the accordion panel for a domain\n * group. OnPush, so an explicit detectChanges() is required to reflect the change.\n */\n OnGroupExpandedChange(group: SharingCenterDomainGroup, expanded: boolean): void {\n group.Expanded = 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 <mj-empty-state class=\"empty\" Size=\"compact\"\n Icon=\"fa-solid fa-inbox\"\n Title=\"Nothing has been shared directly with you yet.\" />\n } @else {\n @for (group of SharedWithMe; track TrackByDomain($index, group)) {\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.Expanded\"\n (ExpandedChange)=\"OnGroupExpandedChange(group, $event)\">\n <ng-template mjAccordionTitle>\n <span class=\"group-icon\"><i [class]=\"group.Icon\"></i></span>\n <span class=\"group-name\">{{ group.DomainName }}</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ group.Rows.length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\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 </ng-template>\n </mj-accordion-panel>\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 <mj-empty-state class=\"empty\" Size=\"compact\"\n Icon=\"fa-solid fa-paper-plane\"\n Title=\"You haven't shared anything with others yet.\" />\n } @else {\n @for (group of SharedByMe; track TrackByDomain($index, group)) {\n <mj-accordion-panel Size=\"sm\" [FlushBody]=\"true\"\n [Expanded]=\"group.Expanded\"\n (ExpandedChange)=\"OnGroupExpandedChange(group, $event)\">\n <ng-template mjAccordionTitle>\n <span class=\"group-icon\"><i [class]=\"group.Icon\"></i></span>\n <span class=\"group-name\">{{ group.DomainName }}</span>\n <span class=\"mj-accordion-badge mj-accordion-badge--right\">{{ group.Rows.length }}</span>\n </ng-template>\n <ng-template mjAccordionBody>\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 </ng-template>\n </mj-accordion-panel>\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": "6.1.0-edge.4",
3
+ "version": "6.1.0-edge.6",
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",
@@ -11,27 +11,27 @@
11
11
  "author": "",
12
12
  "license": "BUSL-1.1",
13
13
  "devDependencies": {
14
- "@angular/compiler": "21.1.3",
15
- "@angular/compiler-cli": "21.1.3",
16
- "@memberjunction/core": "6.1.0-edge.4",
17
- "@memberjunction/ng-test-utils": "6.1.0-edge.4",
14
+ "@angular/compiler": "21.2.22",
15
+ "@angular/compiler-cli": "21.2.22",
16
+ "@memberjunction/core": "6.1.0-edge.6",
17
+ "@memberjunction/ng-test-utils": "6.1.0-edge.6",
18
18
  "vitest": "^4.0.18"
19
19
  },
20
20
  "peerDependencies": {
21
- "@angular/common": "^21.1.3",
22
- "@angular/core": "^21.1.3",
23
- "@angular/forms": "^21.1.3"
21
+ "@angular/common": "^21.2.22",
22
+ "@angular/core": "^21.2.22",
23
+ "@angular/forms": "^21.2.22"
24
24
  },
25
25
  "dependencies": {
26
- "@memberjunction/core": "6.1.0-edge.4",
27
- "@memberjunction/core-entities": "6.1.0-edge.4",
28
- "@memberjunction/global": "6.1.0-edge.4",
29
- "@memberjunction/ng-base-types": "6.1.0-edge.4",
30
- "@memberjunction/ng-container-directives": "6.1.0-edge.4",
31
- "@memberjunction/ng-generic-dialog": "6.1.0-edge.4",
32
- "@memberjunction/ng-notifications": "6.1.0-edge.4",
33
- "@memberjunction/ng-shared-generic": "6.1.0-edge.4",
34
- "@memberjunction/ng-ui-components": "6.1.0-edge.4",
26
+ "@memberjunction/core": "6.1.0-edge.6",
27
+ "@memberjunction/core-entities": "6.1.0-edge.6",
28
+ "@memberjunction/global": "6.1.0-edge.6",
29
+ "@memberjunction/ng-base-types": "6.1.0-edge.6",
30
+ "@memberjunction/ng-container-directives": "6.1.0-edge.6",
31
+ "@memberjunction/ng-generic-dialog": "6.1.0-edge.6",
32
+ "@memberjunction/ng-notifications": "6.1.0-edge.6",
33
+ "@memberjunction/ng-shared-generic": "6.1.0-edge.6",
34
+ "@memberjunction/ng-ui-components": "6.1.0-edge.6",
35
35
  "ag-grid-angular": "^35.0.1",
36
36
  "ag-grid-community": "^35.0.1",
37
37
  "tslib": "^2.8.1"