@memberjunction/ng-resource-permissions 5.50.0 → 6.1.0-edge.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 MemberJunction
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
2
3
|
import { MJUserEntity } from '@memberjunction/core-entities';
|
|
3
4
|
import { ResourceShareAdapter, ResourceShareContext, ResourceShareLevel, ResourceSharePermissionModel } from './resource-share-adapter';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
@@ -14,7 +15,7 @@ export interface ResourceShareDialogResult {
|
|
|
14
15
|
* selector per grantee rather than a grab bag of `Can*` checkboxes. Adapters
|
|
15
16
|
* translate the level to whatever shape their backing entity actually persists.
|
|
16
17
|
*/
|
|
17
|
-
export declare class GenericShareDialogComponent implements OnChanges {
|
|
18
|
+
export declare class GenericShareDialogComponent extends BaseAngularComponent implements OnChanges {
|
|
18
19
|
private cdr;
|
|
19
20
|
Visible: boolean;
|
|
20
21
|
Context: ResourceShareContext | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-share-dialog.component.d.ts","sourceRoot":"","sources":["../../src/lib/resource-share-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"resource-share-dialog.component.d.ts","sourceRoot":"","sources":["../../src/lib/resource-share-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,eAAe,CAAC;AACvI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAE7D,OAAO,EAEH,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,4BAA4B,EAC/B,MAAM,0BAA0B,CAAC;;AAElC;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACtC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC7B;AAED;;;;;GAKG;AACH,qBAOa,2BAA4B,SAAQ,oBAAqB,YAAW,SAAS;IAqB1E,OAAO,CAAC,GAAG;IApBd,OAAO,UAAS;IAChB,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAC5C,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAC3C,MAAM,0CAAiD;IAEjE,SAAgB,MAAM,uBAAyB;IAExC,UAAU,EAAE,4BAA4B,EAAE,CAAM;IAChD,cAAc,EAAE,YAAY,EAAE,CAAM;IAC3C,OAAO,CAAC,QAAQ,CAAsB;IAE/B,SAAS,UAAS;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,gBAAgB,SAAM;IAE7B,+EAA+E;IAC/E,IAAW,mBAAmB,IAAI,MAAM,CAEvC;gBAEmB,GAAG,EAAE,iBAAiB;IAG1C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAOzC,OAAO,CAAC,WAAW;YAQL,QAAQ;IA4BtB,OAAO,CAAC,oBAAoB;IAY5B,IAAW,sBAAsB,IAAI,YAAY,EAAE,CAQlD;IAED,IAAW,UAAU,IAAI,OAAO,CAI/B;IAED,IAAW,YAAY,IAAI,4BAA4B,EAAE,CAExD;IAED,IAAW,aAAa,IAAI,4BAA4B,EAAE,CAEzD;IAED,2EAA2E;IACpE,UAAU,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO;IAIlD,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD,eAAe,CAAC,KAAK,EAAE,4BAA4B,GAAG,IAAI;IAU1D,UAAU,CAAC,KAAK,EAAE,4BAA4B,GAAG,IAAI;IAMrD,QAAQ,CAAC,KAAK,EAAE,4BAA4B,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAKxE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAmD7B,QAAQ,IAAI,IAAI;IAIhB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;yCAlMzC,2BAA2B;2CAA3B,2BAA2B;CA0MvC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
2
3
|
import { RunView } from '@memberjunction/core';
|
|
3
4
|
import { UUIDsEqual } from '@memberjunction/global';
|
|
4
5
|
import { RESOURCE_SHARE_LEVELS } from './resource-share-adapter';
|
|
@@ -258,7 +259,7 @@ function GenericShareDialogComponent_Conditional_0_Template(rf, ctx) { if (rf &
|
|
|
258
259
|
* selector per grantee rather than a grab bag of `Can*` checkboxes. Adapters
|
|
259
260
|
* translate the level to whatever shape their backing entity actually persists.
|
|
260
261
|
*/
|
|
261
|
-
export class GenericShareDialogComponent {
|
|
262
|
+
export class GenericShareDialogComponent extends BaseAngularComponent {
|
|
262
263
|
cdr;
|
|
263
264
|
Visible = false;
|
|
264
265
|
Context = null;
|
|
@@ -276,6 +277,7 @@ export class GenericShareDialogComponent {
|
|
|
276
277
|
return `No users found matching "${this.UserSearchFilter}"`;
|
|
277
278
|
}
|
|
278
279
|
constructor(cdr) {
|
|
280
|
+
super();
|
|
279
281
|
this.cdr = cdr;
|
|
280
282
|
}
|
|
281
283
|
ngOnChanges(changes) {
|
|
@@ -297,7 +299,7 @@ export class GenericShareDialogComponent {
|
|
|
297
299
|
this.IsLoading = true;
|
|
298
300
|
this.cdr.detectChanges();
|
|
299
301
|
try {
|
|
300
|
-
const rv =
|
|
302
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
301
303
|
const usersResult = await rv.RunView({
|
|
302
304
|
EntityName: 'MJ: Users',
|
|
303
305
|
ExtraFilter: 'IsActive = 1',
|
|
@@ -431,7 +433,7 @@ export class GenericShareDialogComponent {
|
|
|
431
433
|
return name.substring(0, 2).toUpperCase();
|
|
432
434
|
}
|
|
433
435
|
static ɵfac = function GenericShareDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || GenericShareDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
434
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: GenericShareDialogComponent, selectors: [["mj-resource-share-dialog"]], inputs: { Visible: "Visible", Context: "Context", Adapter: "Adapter" }, outputs: { Result: "Result" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "mj-share-dialog-window", 3, "Visible", "Width", "MinHeight", "Resizable", "Draggable"], [1, "mj-share-dialog-window", 3, "Close", "Visible", "Width", "MinHeight", "Resizable", "Draggable"], [1, "share-dialog-header"], [1, "fa-solid", "fa-share-nodes"], [1, "share-dialog-body"], ["Variant", "error"], [1, "share-section"], [1, "share-search-box"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Add people by name or email...", 3, "ngModelChange", "ngModel", "disabled"], [1, "share-user-dropdown"], ["Variant", "no-results", "Icon", "fa-solid fa-user-slash", "Size", "compact", 3, "Title"], [1, "share-section-label"], [1, "share-person", "share-owner"], [1, "share-person", 3, "share-person-new", "share-person-modified"], ["Icon", "fa-solid fa-user-lock", "Title", "Not shared with anyone yet", "Size", "compact"], [1, "share-removed-section"], [1, "share-footer"], [1, "share-changes-hint"], [1, "share-footer-actions"], ["type", "button", 1, "share-btn", "share-btn-secondary", 3, "click"], ["type", "button", 1, "share-btn", "share-btn-primary", 3, "click", "disabled"], ["type", "button", 1, "share-user-option", 3, "disabled"], ["type", "button", 1, "share-user-option", 3, "click", "disabled"], [1, "share-avatar"], [1, "share-user-name"], [1, "share-user-email"], [1, "fa-solid", "fa-plus"], [1, "share-avatar", "share-avatar-owner"], [1, "fa-solid", "fa-crown"], [1, "share-person-info"], [1, "share-person-name"], [1, "share-person-role"], [1, "share-person"], [1, "share-badge-new"], [1, "share-person-email"], ["role", "group", "aria-label", "Permission level", 1, "share-level-select"], ["type", "button", 1, "share-level-btn", 3, "active", "title"], ["type", "button", "title", "Remove", 1, "share-remove-btn", 3, "click"], [1, "fa-solid", "fa-times"], ["type", "button", 1, "share-level-btn", 3, "click", "title"], [1, "share-removed-item"], [1, "share-avatar", "share-avatar-removed"], [1, "share-removed-name"], ["type", "button", 1, "share-undo-btn", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "fa-solid", "fa-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"]], template: function GenericShareDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
436
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: GenericShareDialogComponent, selectors: [["mj-resource-share-dialog"]], inputs: { Visible: "Visible", Context: "Context", Adapter: "Adapter" }, outputs: { Result: "Result" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "mj-share-dialog-window", 3, "Visible", "Width", "MinHeight", "Resizable", "Draggable"], [1, "mj-share-dialog-window", 3, "Close", "Visible", "Width", "MinHeight", "Resizable", "Draggable"], [1, "share-dialog-header"], [1, "fa-solid", "fa-share-nodes"], [1, "share-dialog-body"], ["Variant", "error"], [1, "share-section"], [1, "share-search-box"], [1, "fa-solid", "fa-search"], ["type", "text", "placeholder", "Add people by name or email...", 3, "ngModelChange", "ngModel", "disabled"], [1, "share-user-dropdown"], ["Variant", "no-results", "Icon", "fa-solid fa-user-slash", "Size", "compact", 3, "Title"], [1, "share-section-label"], [1, "share-person", "share-owner"], [1, "share-person", 3, "share-person-new", "share-person-modified"], ["Icon", "fa-solid fa-user-lock", "Title", "Not shared with anyone yet", "Size", "compact"], [1, "share-removed-section"], [1, "share-footer"], [1, "share-changes-hint"], [1, "share-footer-actions"], ["type", "button", 1, "share-btn", "share-btn-secondary", 3, "click"], ["type", "button", 1, "share-btn", "share-btn-primary", 3, "click", "disabled"], ["type", "button", 1, "share-user-option", 3, "disabled"], ["type", "button", 1, "share-user-option", 3, "click", "disabled"], [1, "share-avatar"], [1, "share-user-name"], [1, "share-user-email"], [1, "fa-solid", "fa-plus"], [1, "share-avatar", "share-avatar-owner"], [1, "fa-solid", "fa-crown"], [1, "share-person-info"], [1, "share-person-name"], [1, "share-person-role"], [1, "share-person"], [1, "share-badge-new"], [1, "share-person-email"], ["role", "group", "aria-label", "Permission level", 1, "share-level-select"], ["type", "button", 1, "share-level-btn", 3, "active", "title"], ["type", "button", "title", "Remove", 1, "share-remove-btn", 3, "click"], [1, "fa-solid", "fa-times"], ["type", "button", 1, "share-level-btn", 3, "click", "title"], [1, "share-removed-item"], [1, "share-avatar", "share-avatar-removed"], [1, "share-removed-name"], ["type", "button", 1, "share-undo-btn", 3, "click"], [1, "fa-solid", "fa-undo"], [1, "fa-solid", "fa-circle"], [1, "fa-solid", "fa-spinner", "fa-spin"]], template: function GenericShareDialogComponent_Template(rf, ctx) { if (rf & 1) {
|
|
435
437
|
i0.ɵɵconditionalCreate(0, GenericShareDialogComponent_Conditional_0_Template, 30, 17, "mj-window", 0);
|
|
436
438
|
} if (rf & 2) {
|
|
437
439
|
i0.ɵɵconditional(ctx.Visible ? 0 : -1);
|
|
@@ -449,5 +451,5 @@ export class GenericShareDialogComponent {
|
|
|
449
451
|
}], Result: [{
|
|
450
452
|
type: Output
|
|
451
453
|
}] }); })();
|
|
452
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GenericShareDialogComponent, { className: "GenericShareDialogComponent", filePath: "src/lib/resource-share-dialog.component.ts", lineNumber:
|
|
454
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(GenericShareDialogComponent, { className: "GenericShareDialogComponent", filePath: "src/lib/resource-share-dialog.component.ts", lineNumber: 34 }); })();
|
|
453
455
|
//# sourceMappingURL=resource-share-dialog.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-share-dialog.component.js","sourceRoot":"","sources":["../../src/lib/resource-share-dialog.component.ts","../../src/lib/resource-share-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAA+C,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvI,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EACH,qBAAqB,EAKxB,MAAM,0BAA0B,CAAC;;;;;;;ICO1B,mCAA0B;IAAA,YAAW;IAAA,iBAAW;;;IAAtB,cAAW;IAAX,kCAAW;;;IAmB3B,gCAA+B;IAAA,YAAgB;IAAA,iBAAO;;;IAAvB,cAAgB;IAAhB,mCAAgB;;;;IAJnD,kCAAoG;IAApD,+OAAS,4BAAkB,KAAC;IAC1E,gCAA2B;IAAA,YAA2B;IAAA,iBAAO;IAC7D,gCAA8B;IAAA,YAAe;IAAA,iBAAO;IACpD,kIAAkB;IAGlB,wBAAgC;IAClC,iBAAS;;;;IAPoE,2CAAsB;IACtE,eAA2B;IAA3B,qDAA2B;IACxB,eAAe;IAAf,kCAAe;IAC7C,cAEC;IAFD,wCAEC;;;IAPP,+BAAiC;IAC/B,+HASC;IACH,iBAAM;;;IAVJ,cASC;IATD,4CASC;;;IAIH,qCAImB;;;IADjB,kDAA6B;;;IAS7B,AADF,+BAAsC,eACU;IAC5C,wBAAiC;IACnC,iBAAO;IAEL,AADF,+BAA+B,eACG;IAAA,YAA+B;IAAA,iBAAO;IACtE,gCAAgC;IAAA,qBAAK;IAEzC,AADE,AADuC,iBAAO,EACxC,EACF;;;IAH8B,eAA+B;IAA/B,qFAA+B;;;IAY3D,gCAA8B;IAAA,mBAAG;IAAA,iBAAO;;;IAI1C,gCAAiC;IAAA,YAAsB;IAAA,iBAAO;;;IAA7B,cAAsB;IAAtB,yCAAsB;;;;IAKvD,kCAIoC;IAD5B,wRAAS,mCAAsB,KAAC;IAEtC,YACF;IAAA,iBAAS;;;;IAJD,qDAAsC;IAEtC,4CAA2B;IACjC,cACF;IADE,yCACF;;;;IApBJ,AADF,+BAAmH,eACtF;IAAA,YAAiC;IAAA,iBAAO;IAEjE,AADF,+BAA+B,eACG;IAC9B,YACA;IAAA,oHAAmB;IAGrB,iBAAO;IACP,oHAAwB;IAG1B,iBAAM;IACN,+BAA2E;IACzE,0IAQC;IACH,iBAAM;IACN,mCAA+F;IAAhD,mOAAS,gCAAsB,KAAC;IAC7E,yBAAiC;IAErC,AADE,iBAAS,EACL;;;;IA3B2D,AAAvC,kDAAsC,sDAAkD;IACrF,eAAiC;IAAjC,2DAAiC;IAGxD,eACA;IADA,mDACA;IAAA,cAEC;IAFD,yCAEC;IAEH,cAEC;IAFD,8CAEC;IAGD,eAQC;IARD,4BAQC;;;IAQL,qCAGmB;;;;IAMb,AADF,+BAAgC,eACkB;IAAA,YAAiC;IAAA,iBAAO;IACxF,gCAAiC;IAAA,YAAqB;IAAA,iBAAO;IAC7D,kCAAyE;IAA5B,iPAAS,4BAAiB,KAAC;IACtE,wBAAgC;IAAC,sBACnC;IACF,AADE,iBAAS,EACL;;;;IAL4C,eAAiC;IAAjC,4DAAiC;IAChD,eAAqB;IAArB,yCAAqB;;;IAJ5D,+BAAmC;IACjC,4HAQC;IACH,iBAAM;;;IATJ,cAQC;IARD,mCAQC;;;IAMH,gCAAiC;IAC/B,wBAAkC;IAAC,iCACrC;IAAA,iBAAO;;;IAYH,wBAA2C;IAAC,2BAC9C;;;IACE,sBACF;;;;IArIV,oCAOiC;IAD/B,kMAAS,iBAAU,KAAC;IAGlB,AADF,0CAAoB,aACe;IAC/B,uBAAuC;IACvC,4BAAM;IAAA,YAAmC;IAE7C,AADE,AAD2C,iBAAO,EAC5C,EACa;IACrB,8BAA+B;IAC7B,gHAAa;IAKX,AADF,8BAA2B,aACK;IAC5B,wBAAkC;IAClC,iCAIyB;IADvB,oUAA8B;IAElC,AALE,iBAIyB,EACrB;IACN,8GAAyC;IAczC,yHAA+D;IAOjE,iBAAM;IAGJ,AADF,+BAA2B,eACQ;IAAA,mCAAkB;IAAA,iBAAM;IACzD,8GAAiC;IAWjC,gHA6BC;IACD,yHAAiC;IAMjC,8GAAgC;IAalC,iBAAM;IACN,gCAA0B;IACxB,+GAAkB;IAMhB,AADF,gCAAkC,kBACiD;IAArB,gMAAS,iBAAU,KAAC;IAC9E,yBACF;IAAA,iBAAS;IACT,mCAIwC;IADtC,gMAAS,eAAQ,KAAC;IAIhB,AAFF,mGAAiB,6EAER;IAOnB,AADE,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF,EACI;;;IArIV,AADA,AADA,AADA,AADA,8BAAgB,cACH,kBACI,oBACE,mBACD;IAMR,eAAmC;IAAnC,oGAAmC;IAI3C,eAEC;IAFD,uCAEC;IAQK,eAA8B;IAA9B,uDAA8B;IAC9B,2CAAsB;IAE1B,cAaC;IAbD,oEAaC;IACD,cAMC;IAND,iGAMC;IAKD,eAUC;IAVD,6FAUC;IACD,cA6BC;IA7BD,kCA6BC;IACD,eAKC;IALD,4DAKC;IACD,cAYC;IAZD,2DAYC;IAGD,eAIC;IAJD,6CAIC;IASG,eAAqC;IAArC,iEAAqC;IACrC,cAIC;IAJD,4CAIC;;ADnHb;;;;;GAKG;AAQH,MAAM,OAAO,2BAA2B;IAqBhB;IApBX,OAAO,GAAG,KAAK,CAAC;IAChB,OAAO,GAAgC,IAAI,CAAC;IAC5C,OAAO,GAAgC,IAAI,CAAC;IAC3C,MAAM,GAAG,IAAI,YAAY,EAA6B,CAAC;IAEjD,MAAM,GAAG,qBAAqB,CAAC;IAExC,UAAU,GAAmC,EAAE,CAAC;IAChD,cAAc,GAAmB,EAAE,CAAC;IACnC,QAAQ,GAAmB,EAAE,CAAC;IAE/B,SAAS,GAAG,KAAK,CAAC;IAClB,KAAK,GAAkB,IAAI,CAAC;IAC5B,gBAAgB,GAAG,EAAE,CAAC;IAE7B,+EAA+E;IAC/E,IAAW,mBAAmB;QAC1B,OAAO,4BAA4B,IAAI,CAAC,gBAAgB,GAAG,CAAC;IAChE,CAAC;IAED,YAAoB,GAAsB;QAAtB,QAAG,GAAH,GAAG,CAAmB;IAAG,CAAC;IAE9C,WAAW,CAAC,OAAsB;QAC9B,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACrE,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpB,CAAC;IACL,CAAC;IAEO,WAAW;QACf,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,QAAQ;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE3C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAAe;gBAC/C,UAAU,EAAE,WAAW;gBACvB,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,eAAe;aAC9B,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAE/D,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,GAAG,gDAAgD,CAAC;QAClE,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAEO,oBAAoB;QACxB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,aAAa,GAAG,IAAI,GAAG,CACzB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAC3E,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YAChD,IAAI,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC1D,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,IAAW,sBAAsB;QAC7B,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;QACnD,OAAO,IAAI,CAAC,cAAc;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;aAC3G,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtB,CAAC;IAED,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,aAAa,CACtE,CAAC;IACN,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC9D,CAAC;IAED,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC7D,CAAC;IAED,2EAA2E;IACpE,UAAU,CAAC,KAAmC;QACjD,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,aAAa,CAAC;IAC/D,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,IAAkB;QACxC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC3C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/D,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEM,eAAe,CAAC,KAAmC;QACtD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEM,UAAU,CAAC,KAAmC;QACjD,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEM,QAAQ,CAAC,KAAmC,EAAE,KAAyB;QAC1E,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC7B,CAAC;IAEM,KAAK,CAAC,MAAM;QACf,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC3C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO;QACX,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;gBACtD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,MAAM,IAAI,KAAK,CACX,8BAA8B,KAAK,CAAC,IAAI,CAAC,IAAI,KACzC,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,IAAI,eACpD,EAAE,CACL,CAAC;gBACN,CAAC;YACL,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,aAAa,CAAC,CACzE,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBACtC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;gBAClD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACT,MAAM,IAAI,KAAK,CACX,4BAA4B,KAAK,CAAC,IAAI,CAAC,IAAI,KACvC,KAAK,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,IAAI,eACpD,EAAE,CACL,CAAC;gBACN,CAAC;YACL,CAAC;YAED,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAC7C,IAAI,CAAC,KAAK,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kCAAkC,CAAC;QAC7F,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;IACL,CAAC;IAEM,QAAQ;QACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEM,eAAe,CAAC,IAAkB;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9C,CAAC;qHAxMQ,2BAA2B;6DAA3B,2BAA2B;YChCxC,qGAAe;;YAAf,sCA4IC;;;iFD5GY,2BAA2B;cAPvC,SAAS;6BACM,KAAK,YACP,0BAA0B,iBAGrB,iBAAiB,CAAC,IAAI;;kBAGpC,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,MAAM;;kFAJE,2BAA2B","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef, ViewEncapsulation } from '@angular/core';\nimport { RunView } from '@memberjunction/core';\nimport { MJUserEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport {\n RESOURCE_SHARE_LEVELS,\n ResourceShareAdapter,\n ResourceShareContext,\n ResourceShareLevel,\n ResourceSharePermissionModel\n} from './resource-share-adapter';\n\n/**\n * Result emitted when {@link GenericShareDialogComponent} closes.\n */\nexport interface ResourceShareDialogResult {\n Action: 'save' | 'cancel';\n}\n\n/**\n * Resource-type-agnostic share dialog. Every resource's sharing UX collapses to\n * three tiers — View / Edit / Owner — so the dialog exposes a single level\n * selector per grantee rather than a grab bag of `Can*` checkboxes. Adapters\n * translate the level to whatever shape their backing entity actually persists.\n */\n@Component({\n standalone: false,\n selector: 'mj-resource-share-dialog',\n templateUrl: './resource-share-dialog.component.html',\n styleUrls: ['./resource-share-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class GenericShareDialogComponent implements OnChanges {\n @Input() Visible = false;\n @Input() Context: ResourceShareContext | null = null;\n @Input() Adapter: ResourceShareAdapter | null = null;\n @Output() Result = new EventEmitter<ResourceShareDialogResult>();\n\n public readonly Levels = RESOURCE_SHARE_LEVELS;\n\n public UserShares: ResourceSharePermissionModel[] = [];\n public AvailableUsers: MJUserEntity[] = [];\n private allUsers: MJUserEntity[] = [];\n\n public IsLoading = false;\n public Error: string | null = null;\n public UserSearchFilter = '';\n\n /** Message for the no-results empty-state, echoing the current search term. */\n public get NoUsersFoundMessage(): string {\n return `No users found matching \"${this.UserSearchFilter}\"`;\n }\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Visible'] && this.Visible && this.Context && this.Adapter) {\n this.resetDialog();\n this.loadData();\n }\n }\n\n private resetDialog(): void {\n this.Error = null;\n this.IsLoading = false;\n this.UserShares = [];\n this.AvailableUsers = [];\n this.UserSearchFilter = '';\n }\n\n private async loadData(): Promise<void> {\n if (!this.Context || !this.Adapter) return;\n\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = new RunView();\n const usersResult = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: 'IsActive = 1',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n this.allUsers = usersResult.Success ? usersResult.Results : [];\n\n this.UserShares = await this.Adapter.LoadShares(this.Context);\n this.UserShares.forEach((s) => (s._InitialLevel = s.Level));\n this.updateAvailableUsers();\n } catch (error) {\n console.error('Error loading share data:', error);\n this.Error = 'Failed to load sharing data. Please try again.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private updateAvailableUsers(): void {\n if (!this.Context) return;\n const sharedUserIds = new Set(\n this.UserShares.filter((s) => !s.MarkedForRemoval).map((s) => s.User.ID)\n );\n const ownerId = this.Context.OwnerUserID;\n this.AvailableUsers = this.allUsers.filter((user) => {\n if (ownerId && UUIDsEqual(user.ID, ownerId)) return false;\n return !sharedUserIds.has(user.ID);\n });\n }\n\n public get FilteredAvailableUsers(): MJUserEntity[] {\n if (!this.UserSearchFilter.trim()) {\n return this.AvailableUsers.slice(0, 10);\n }\n const filter = this.UserSearchFilter.toLowerCase();\n return this.AvailableUsers\n .filter((u) => u.Name.toLowerCase().includes(filter) || (u.Email && u.Email.toLowerCase().includes(filter)))\n .slice(0, 10);\n }\n\n public get HasChanges(): boolean {\n return this.UserShares.some(\n (s) => s.IsNew || s.MarkedForRemoval || s.Level !== s._InitialLevel\n );\n }\n\n public get ActiveShares(): ResourceSharePermissionModel[] {\n return this.UserShares.filter((s) => !s.MarkedForRemoval);\n }\n\n public get RemovedShares(): ResourceSharePermissionModel[] {\n return this.UserShares.filter((s) => s.MarkedForRemoval);\n }\n\n /** Highlight rows whose level has been changed from their loaded state. */\n public isModified(share: ResourceSharePermissionModel): boolean {\n return !share.IsNew && share.Level !== share._InitialLevel;\n }\n\n public async addUserShare(user: MJUserEntity): Promise<void> {\n if (!this.Context || !this.Adapter) return;\n const row = await this.Adapter.CreateShare(this.Context, user);\n row._InitialLevel = row.Level;\n this.UserShares.push(row);\n this.updateAvailableUsers();\n this.UserSearchFilter = '';\n this.cdr.detectChanges();\n }\n\n public removeUserShare(share: ResourceSharePermissionModel): void {\n if (share.IsNew) {\n this.UserShares = this.UserShares.filter((s) => s !== share);\n } else {\n share.MarkedForRemoval = true;\n }\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n public undoRemove(share: ResourceSharePermissionModel): void {\n share.MarkedForRemoval = false;\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n public setLevel(share: ResourceSharePermissionModel, level: ResourceShareLevel): void {\n share.Level = level;\n this.cdr.detectChanges();\n }\n\n public async onSave(): Promise<void> {\n if (!this.Adapter || !this.Context) return;\n if (!this.HasChanges) {\n this.onCancel();\n return;\n }\n this.IsLoading = true;\n this.Error = null;\n this.cdr.detectChanges();\n\n try {\n for (const share of this.UserShares.filter((s) => s.MarkedForRemoval && !s.IsNew)) {\n const deleted = await share.PermissionEntity.Delete();\n if (!deleted) {\n throw new Error(\n `Failed to remove share for ${share.User.Name}: ${\n share.PermissionEntity.LatestResult?.Message ?? 'unknown error'\n }`\n );\n }\n }\n\n const dirtyRows = this.UserShares.filter(\n (s) => !s.MarkedForRemoval && (s.IsNew || s.Level !== s._InitialLevel)\n );\n for (const share of dirtyRows) {\n this.Adapter.SyncLevelToEntity(share);\n const saved = await share.PermissionEntity.Save();\n if (!saved) {\n throw new Error(\n `Failed to save share for ${share.User.Name}: ${\n share.PermissionEntity.LatestResult?.Message ?? 'unknown error'\n }`\n );\n }\n }\n\n if (this.Adapter.AfterSave) {\n await this.Adapter.AfterSave(this.Context);\n }\n\n this.Result.emit({ Action: 'save' });\n } catch (error) {\n console.error('Error saving shares:', error);\n this.Error = error instanceof Error ? error.message : 'Failed to save sharing settings.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public onCancel(): void {\n this.Result.emit({ Action: 'cancel' });\n }\n\n public getUserInitials(user: MJUserEntity): string {\n const name = user.Name || user.Email || '?';\n const parts = name.split(' ');\n if (parts.length >= 2) {\n return (parts[0][0] + parts[1][0]).toUpperCase();\n }\n return name.substring(0, 2).toUpperCase();\n }\n}\n","@if (Visible) {\n <mj-window\n [Visible]=\"true\"\n [Width]=\"560\"\n [MinHeight]=\"200\"\n [Resizable]=\"false\"\n [Draggable]=\"true\"\n (Close)=\"onCancel()\"\n class=\"mj-share-dialog-window\">\n <mj-window-titlebar>\n <div class=\"share-dialog-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Share \"{{ Context?.ResourceName }}\"</span>\n </div>\n </mj-window-titlebar>\n <div class=\"share-dialog-body\">\n @if (Error) {\n <mj-alert Variant=\"error\">{{ Error }}</mj-alert>\n }\n <!-- Add Users Section -->\n <div class=\"share-section\">\n <div class=\"share-search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Add people by name or email...\"\n [(ngModel)]=\"UserSearchFilter\"\n [disabled]=\"IsLoading\">\n </div>\n @if (FilteredAvailableUsers.length > 0) {\n <div class=\"share-user-dropdown\">\n @for (user of FilteredAvailableUsers; track user.ID) {\n <button type=\"button\" class=\"share-user-option\" (click)=\"addUserShare(user)\" [disabled]=\"IsLoading\">\n <span class=\"share-avatar\">{{ getUserInitials(user) }}</span>\n <span class=\"share-user-name\">{{ user.Name }}</span>\n @if (user.Email) {\n <span class=\"share-user-email\">{{ user.Email }}</span>\n }\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n }\n @if (UserSearchFilter && FilteredAvailableUsers.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Icon=\"fa-solid fa-user-slash\"\n [Title]=\"NoUsersFoundMessage\"\n Size=\"compact\" />\n }\n </div>\n <!-- People with Access -->\n <div class=\"share-section\">\n <div class=\"share-section-label\">People with access</div>\n @if (Context?.OwnerDisplayName) {\n <div class=\"share-person share-owner\">\n <span class=\"share-avatar share-avatar-owner\">\n <i class=\"fa-solid fa-crown\"></i>\n </span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">{{ Context?.OwnerDisplayName }}</span>\n <span class=\"share-person-role\">Owner</span>\n </div>\n </div>\n }\n @for (share of ActiveShares; track share.User.ID) {\n <div class=\"share-person\" [class.share-person-new]=\"share.IsNew\" [class.share-person-modified]=\"isModified(share)\">\n <span class=\"share-avatar\">{{ getUserInitials(share.User) }}</span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">\n {{ share.User.Name }}\n @if (share.IsNew) {\n <span class=\"share-badge-new\">New</span>\n }\n </span>\n @if (share.User.Email) {\n <span class=\"share-person-email\">{{ share.User.Email }}</span>\n }\n </div>\n <div class=\"share-level-select\" role=\"group\" aria-label=\"Permission level\">\n @for (level of Levels; track level) {\n <button type=\"button\"\n class=\"share-level-btn\"\n [class.active]=\"share.Level === level\"\n (click)=\"setLevel(share, level)\"\n [title]=\"level + ' access'\">\n {{ level }}\n </button>\n }\n </div>\n <button type=\"button\" class=\"share-remove-btn\" (click)=\"removeUserShare(share)\" title=\"Remove\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n @if (ActiveShares.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-user-lock\"\n Title=\"Not shared with anyone yet\"\n Size=\"compact\" />\n }\n @if (RemovedShares.length > 0) {\n <div class=\"share-removed-section\">\n @for (share of RemovedShares; track share.User.ID) {\n <div class=\"share-removed-item\">\n <span class=\"share-avatar share-avatar-removed\">{{ getUserInitials(share.User) }}</span>\n <span class=\"share-removed-name\">{{ share.User.Name }}</span>\n <button type=\"button\" class=\"share-undo-btn\" (click)=\"undoRemove(share)\">\n <i class=\"fa-solid fa-undo\"></i> Undo\n </button>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"share-footer\">\n @if (HasChanges) {\n <span class=\"share-changes-hint\">\n <i class=\"fa-solid fa-circle\"></i> Unsaved changes\n </span>\n }\n <div class=\"share-footer-actions\">\n <button type=\"button\" class=\"share-btn share-btn-secondary\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"share-btn share-btn-primary\"\n (click)=\"onSave()\"\n [disabled]=\"!HasChanges || IsLoading\">\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n Save\n }\n </button>\n </div>\n </div>\n </div>\n </mj-window>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resource-share-dialog.component.js","sourceRoot":"","sources":["../../src/lib/resource-share-dialog.component.ts","../../src/lib/resource-share-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef, ViewEncapsulation } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { RunView } from '@memberjunction/core';\nimport { MJUserEntity } from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport {\n RESOURCE_SHARE_LEVELS,\n ResourceShareAdapter,\n ResourceShareContext,\n ResourceShareLevel,\n ResourceSharePermissionModel\n} from './resource-share-adapter';\n\n/**\n * Result emitted when {@link GenericShareDialogComponent} closes.\n */\nexport interface ResourceShareDialogResult {\n Action: 'save' | 'cancel';\n}\n\n/**\n * Resource-type-agnostic share dialog. Every resource's sharing UX collapses to\n * three tiers — View / Edit / Owner — so the dialog exposes a single level\n * selector per grantee rather than a grab bag of `Can*` checkboxes. Adapters\n * translate the level to whatever shape their backing entity actually persists.\n */\n@Component({\n standalone: false,\n selector: 'mj-resource-share-dialog',\n templateUrl: './resource-share-dialog.component.html',\n styleUrls: ['./resource-share-dialog.component.css'],\n encapsulation: ViewEncapsulation.None\n})\nexport class GenericShareDialogComponent extends BaseAngularComponent implements OnChanges {\n @Input() Visible = false;\n @Input() Context: ResourceShareContext | null = null;\n @Input() Adapter: ResourceShareAdapter | null = null;\n @Output() Result = new EventEmitter<ResourceShareDialogResult>();\n\n public readonly Levels = RESOURCE_SHARE_LEVELS;\n\n public UserShares: ResourceSharePermissionModel[] = [];\n public AvailableUsers: MJUserEntity[] = [];\n private allUsers: MJUserEntity[] = [];\n\n public IsLoading = false;\n public Error: string | null = null;\n public UserSearchFilter = '';\n\n /** Message for the no-results empty-state, echoing the current search term. */\n public get NoUsersFoundMessage(): string {\n return `No users found matching \"${this.UserSearchFilter}\"`;\n }\n\n constructor(private cdr: ChangeDetectorRef) {\n super();}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Visible'] && this.Visible && this.Context && this.Adapter) {\n this.resetDialog();\n this.loadData();\n }\n }\n\n private resetDialog(): void {\n this.Error = null;\n this.IsLoading = false;\n this.UserShares = [];\n this.AvailableUsers = [];\n this.UserSearchFilter = '';\n }\n\n private async loadData(): Promise<void> {\n if (!this.Context || !this.Adapter) return;\n\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const usersResult = await rv.RunView<MJUserEntity>({\n EntityName: 'MJ: Users',\n ExtraFilter: 'IsActive = 1',\n OrderBy: 'Name',\n ResultType: 'entity_object'\n });\n this.allUsers = usersResult.Success ? usersResult.Results : [];\n\n this.UserShares = await this.Adapter.LoadShares(this.Context);\n this.UserShares.forEach((s) => (s._InitialLevel = s.Level));\n this.updateAvailableUsers();\n } catch (error) {\n console.error('Error loading share data:', error);\n this.Error = 'Failed to load sharing data. Please try again.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n private updateAvailableUsers(): void {\n if (!this.Context) return;\n const sharedUserIds = new Set(\n this.UserShares.filter((s) => !s.MarkedForRemoval).map((s) => s.User.ID)\n );\n const ownerId = this.Context.OwnerUserID;\n this.AvailableUsers = this.allUsers.filter((user) => {\n if (ownerId && UUIDsEqual(user.ID, ownerId)) return false;\n return !sharedUserIds.has(user.ID);\n });\n }\n\n public get FilteredAvailableUsers(): MJUserEntity[] {\n if (!this.UserSearchFilter.trim()) {\n return this.AvailableUsers.slice(0, 10);\n }\n const filter = this.UserSearchFilter.toLowerCase();\n return this.AvailableUsers\n .filter((u) => u.Name.toLowerCase().includes(filter) || (u.Email && u.Email.toLowerCase().includes(filter)))\n .slice(0, 10);\n }\n\n public get HasChanges(): boolean {\n return this.UserShares.some(\n (s) => s.IsNew || s.MarkedForRemoval || s.Level !== s._InitialLevel\n );\n }\n\n public get ActiveShares(): ResourceSharePermissionModel[] {\n return this.UserShares.filter((s) => !s.MarkedForRemoval);\n }\n\n public get RemovedShares(): ResourceSharePermissionModel[] {\n return this.UserShares.filter((s) => s.MarkedForRemoval);\n }\n\n /** Highlight rows whose level has been changed from their loaded state. */\n public isModified(share: ResourceSharePermissionModel): boolean {\n return !share.IsNew && share.Level !== share._InitialLevel;\n }\n\n public async addUserShare(user: MJUserEntity): Promise<void> {\n if (!this.Context || !this.Adapter) return;\n const row = await this.Adapter.CreateShare(this.Context, user);\n row._InitialLevel = row.Level;\n this.UserShares.push(row);\n this.updateAvailableUsers();\n this.UserSearchFilter = '';\n this.cdr.detectChanges();\n }\n\n public removeUserShare(share: ResourceSharePermissionModel): void {\n if (share.IsNew) {\n this.UserShares = this.UserShares.filter((s) => s !== share);\n } else {\n share.MarkedForRemoval = true;\n }\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n public undoRemove(share: ResourceSharePermissionModel): void {\n share.MarkedForRemoval = false;\n this.updateAvailableUsers();\n this.cdr.detectChanges();\n }\n\n public setLevel(share: ResourceSharePermissionModel, level: ResourceShareLevel): void {\n share.Level = level;\n this.cdr.detectChanges();\n }\n\n public async onSave(): Promise<void> {\n if (!this.Adapter || !this.Context) return;\n if (!this.HasChanges) {\n this.onCancel();\n return;\n }\n this.IsLoading = true;\n this.Error = null;\n this.cdr.detectChanges();\n\n try {\n for (const share of this.UserShares.filter((s) => s.MarkedForRemoval && !s.IsNew)) {\n const deleted = await share.PermissionEntity.Delete();\n if (!deleted) {\n throw new Error(\n `Failed to remove share for ${share.User.Name}: ${\n share.PermissionEntity.LatestResult?.Message ?? 'unknown error'\n }`\n );\n }\n }\n\n const dirtyRows = this.UserShares.filter(\n (s) => !s.MarkedForRemoval && (s.IsNew || s.Level !== s._InitialLevel)\n );\n for (const share of dirtyRows) {\n this.Adapter.SyncLevelToEntity(share);\n const saved = await share.PermissionEntity.Save();\n if (!saved) {\n throw new Error(\n `Failed to save share for ${share.User.Name}: ${\n share.PermissionEntity.LatestResult?.Message ?? 'unknown error'\n }`\n );\n }\n }\n\n if (this.Adapter.AfterSave) {\n await this.Adapter.AfterSave(this.Context);\n }\n\n this.Result.emit({ Action: 'save' });\n } catch (error) {\n console.error('Error saving shares:', error);\n this.Error = error instanceof Error ? error.message : 'Failed to save sharing settings.';\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n public onCancel(): void {\n this.Result.emit({ Action: 'cancel' });\n }\n\n public getUserInitials(user: MJUserEntity): string {\n const name = user.Name || user.Email || '?';\n const parts = name.split(' ');\n if (parts.length >= 2) {\n return (parts[0][0] + parts[1][0]).toUpperCase();\n }\n return name.substring(0, 2).toUpperCase();\n }\n}\n","@if (Visible) {\n <mj-window\n [Visible]=\"true\"\n [Width]=\"560\"\n [MinHeight]=\"200\"\n [Resizable]=\"false\"\n [Draggable]=\"true\"\n (Close)=\"onCancel()\"\n class=\"mj-share-dialog-window\">\n <mj-window-titlebar>\n <div class=\"share-dialog-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Share \"{{ Context?.ResourceName }}\"</span>\n </div>\n </mj-window-titlebar>\n <div class=\"share-dialog-body\">\n @if (Error) {\n <mj-alert Variant=\"error\">{{ Error }}</mj-alert>\n }\n <!-- Add Users Section -->\n <div class=\"share-section\">\n <div class=\"share-search-box\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n type=\"text\"\n placeholder=\"Add people by name or email...\"\n [(ngModel)]=\"UserSearchFilter\"\n [disabled]=\"IsLoading\">\n </div>\n @if (FilteredAvailableUsers.length > 0) {\n <div class=\"share-user-dropdown\">\n @for (user of FilteredAvailableUsers; track user.ID) {\n <button type=\"button\" class=\"share-user-option\" (click)=\"addUserShare(user)\" [disabled]=\"IsLoading\">\n <span class=\"share-avatar\">{{ getUserInitials(user) }}</span>\n <span class=\"share-user-name\">{{ user.Name }}</span>\n @if (user.Email) {\n <span class=\"share-user-email\">{{ user.Email }}</span>\n }\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n }\n </div>\n }\n @if (UserSearchFilter && FilteredAvailableUsers.length === 0) {\n <mj-empty-state\n Variant=\"no-results\"\n Icon=\"fa-solid fa-user-slash\"\n [Title]=\"NoUsersFoundMessage\"\n Size=\"compact\" />\n }\n </div>\n <!-- People with Access -->\n <div class=\"share-section\">\n <div class=\"share-section-label\">People with access</div>\n @if (Context?.OwnerDisplayName) {\n <div class=\"share-person share-owner\">\n <span class=\"share-avatar share-avatar-owner\">\n <i class=\"fa-solid fa-crown\"></i>\n </span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">{{ Context?.OwnerDisplayName }}</span>\n <span class=\"share-person-role\">Owner</span>\n </div>\n </div>\n }\n @for (share of ActiveShares; track share.User.ID) {\n <div class=\"share-person\" [class.share-person-new]=\"share.IsNew\" [class.share-person-modified]=\"isModified(share)\">\n <span class=\"share-avatar\">{{ getUserInitials(share.User) }}</span>\n <div class=\"share-person-info\">\n <span class=\"share-person-name\">\n {{ share.User.Name }}\n @if (share.IsNew) {\n <span class=\"share-badge-new\">New</span>\n }\n </span>\n @if (share.User.Email) {\n <span class=\"share-person-email\">{{ share.User.Email }}</span>\n }\n </div>\n <div class=\"share-level-select\" role=\"group\" aria-label=\"Permission level\">\n @for (level of Levels; track level) {\n <button type=\"button\"\n class=\"share-level-btn\"\n [class.active]=\"share.Level === level\"\n (click)=\"setLevel(share, level)\"\n [title]=\"level + ' access'\">\n {{ level }}\n </button>\n }\n </div>\n <button type=\"button\" class=\"share-remove-btn\" (click)=\"removeUserShare(share)\" title=\"Remove\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n @if (ActiveShares.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-user-lock\"\n Title=\"Not shared with anyone yet\"\n Size=\"compact\" />\n }\n @if (RemovedShares.length > 0) {\n <div class=\"share-removed-section\">\n @for (share of RemovedShares; track share.User.ID) {\n <div class=\"share-removed-item\">\n <span class=\"share-avatar share-avatar-removed\">{{ getUserInitials(share.User) }}</span>\n <span class=\"share-removed-name\">{{ share.User.Name }}</span>\n <button type=\"button\" class=\"share-undo-btn\" (click)=\"undoRemove(share)\">\n <i class=\"fa-solid fa-undo\"></i> Undo\n </button>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"share-footer\">\n @if (HasChanges) {\n <span class=\"share-changes-hint\">\n <i class=\"fa-solid fa-circle\"></i> Unsaved changes\n </span>\n }\n <div class=\"share-footer-actions\">\n <button type=\"button\" class=\"share-btn share-btn-secondary\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"share-btn share-btn-primary\"\n (click)=\"onSave()\"\n [disabled]=\"!HasChanges || IsLoading\">\n @if (IsLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i> Saving...\n } @else {\n Save\n }\n </button>\n </div>\n </div>\n </div>\n </mj-window>\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,43 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-resource-permissions",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.1.0-edge.0",
|
|
4
4
|
"description": "MemberJunction: Generic Angular components for displaying/editing permissions for a resource",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
7
7
|
"files": [
|
|
8
8
|
"/dist"
|
|
9
9
|
],
|
|
10
|
-
"scripts": {
|
|
11
|
-
"test": "vitest run",
|
|
12
|
-
"build": "ngc",
|
|
13
|
-
"test:watch": "vitest"
|
|
14
|
-
},
|
|
15
10
|
"keywords": [],
|
|
16
11
|
"author": "",
|
|
17
12
|
"license": "ISC",
|
|
18
13
|
"devDependencies": {
|
|
19
14
|
"@angular/compiler": "21.1.3",
|
|
20
15
|
"@angular/compiler-cli": "21.1.3",
|
|
21
|
-
"@memberjunction/core": "
|
|
22
|
-
"@memberjunction/ng-test-utils": "
|
|
16
|
+
"@memberjunction/core": "6.1.0-edge.0",
|
|
17
|
+
"@memberjunction/ng-test-utils": "6.1.0-edge.0",
|
|
23
18
|
"vitest": "^4.0.18"
|
|
24
19
|
},
|
|
25
20
|
"peerDependencies": {
|
|
26
21
|
"@angular/common": "21.1.3",
|
|
27
22
|
"@angular/core": "21.1.3",
|
|
28
|
-
"@angular/forms": "21.1.3"
|
|
29
|
-
"@angular/router": "21.1.3"
|
|
23
|
+
"@angular/forms": "21.1.3"
|
|
30
24
|
},
|
|
31
25
|
"dependencies": {
|
|
32
|
-
"@memberjunction/core": "
|
|
33
|
-
"@memberjunction/core-entities": "
|
|
34
|
-
"@memberjunction/global": "
|
|
35
|
-
"@memberjunction/ng-base-types": "
|
|
36
|
-
"@memberjunction/ng-container-directives": "
|
|
37
|
-
"@memberjunction/ng-generic-dialog": "
|
|
38
|
-
"@memberjunction/ng-notifications": "
|
|
39
|
-
"@memberjunction/ng-shared-generic": "
|
|
40
|
-
"@memberjunction/ng-ui-components": "
|
|
26
|
+
"@memberjunction/core": "6.1.0-edge.0",
|
|
27
|
+
"@memberjunction/core-entities": "6.1.0-edge.0",
|
|
28
|
+
"@memberjunction/global": "6.1.0-edge.0",
|
|
29
|
+
"@memberjunction/ng-base-types": "6.1.0-edge.0",
|
|
30
|
+
"@memberjunction/ng-container-directives": "6.1.0-edge.0",
|
|
31
|
+
"@memberjunction/ng-generic-dialog": "6.1.0-edge.0",
|
|
32
|
+
"@memberjunction/ng-notifications": "6.1.0-edge.0",
|
|
33
|
+
"@memberjunction/ng-shared-generic": "6.1.0-edge.0",
|
|
34
|
+
"@memberjunction/ng-ui-components": "6.1.0-edge.0",
|
|
41
35
|
"ag-grid-angular": "^35.0.1",
|
|
42
36
|
"ag-grid-community": "^35.0.1",
|
|
43
37
|
"tslib": "^2.8.1"
|
|
@@ -46,5 +40,12 @@
|
|
|
46
40
|
"repository": {
|
|
47
41
|
"type": "git",
|
|
48
42
|
"url": "https://github.com/MemberJunction/MJ"
|
|
43
|
+
},
|
|
44
|
+
"mjUILayer": "widgets",
|
|
45
|
+
"scripts": {
|
|
46
|
+
"test": "vitest run",
|
|
47
|
+
"test:types": "tsc --noEmit -p tsconfig.spec.json",
|
|
48
|
+
"build": "ngc",
|
|
49
|
+
"test:watch": "vitest"
|
|
49
50
|
}
|
|
50
|
-
}
|
|
51
|
+
}
|