@memberjunction/ng-file-storage 6.2.0-edge.3 → 6.2.0-edge.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/admin/storage-admin-dialog.component.d.ts.map +1 -1
- package/dist/lib/admin/storage-admin-dialog.component.js +10 -6
- package/dist/lib/admin/storage-admin-dialog.component.js.map +1 -1
- package/dist/lib/files-grid/files-grid.d.ts +2 -0
- package/dist/lib/files-grid/files-grid.d.ts.map +1 -1
- package/dist/lib/files-grid/files-grid.js +5 -4
- package/dist/lib/files-grid/files-grid.js.map +1 -1
- package/dist/lib/record-attachments/record-attachments.component.d.ts.map +1 -1
- package/dist/lib/record-attachments/record-attachments.component.js +7 -2
- package/dist/lib/record-attachments/record-attachments.component.js.map +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-admin-dialog.component.d.ts","sourceRoot":"","sources":["../../../src/lib/admin/storage-admin-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,YAAY,EAEZ,MAAM,EAKP,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAEL,0BAA0B,EAC1B,2BAA2B,EAC3B,oCAAoC,EACpC,kBAAkB,EAClB,YAAY,EACb,MAAM,+BAA+B,CAAC;;AAKvC,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,WAAW,CAAC;AAEvD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,0BAA0B,CAAC;IACpC,QAAQ,CAAC,EAAE,2BAA2B,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAMa,2BAA4B,YAAW,MAAM;IACxD,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,gBAAgB,CAAmC;IAElD,OAAO,EAAE,OAAO,CAAS;IACzB,SAAS,EAAE,eAAe,CAAc;IACxC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAEzC,KAAK,qBAA4B;IACjC,eAAe,qBAA4B;IAErD,IAAW,aAAa,IAAI,iBAAiB,CAE5C;IAGM,SAAS,EAAE,OAAO,CAAS;IAC3B,QAAQ,EAAE,OAAO,CAAS;IAC1B,UAAU,EAAE,MAAM,CAAM;IAExB,SAAS,EAAE,2BAA2B,EAAE,CAAM;IAC9C,QAAQ,EAAE,0BAA0B,EAAE,CAAM;IAC5C,WAAW,EAAE,kBAAkB,EAAE,CAAM;IACvC,KAAK,EAAE,YAAY,EAAE,CAAM;IAC3B,kBAAkB,EAAE,oCAAoC,EAAE,CAAM;IAGhE,gBAAgB,EAAE,OAAO,CAAS;IAClC,cAAc,EAAE,0BAA0B,GAAG,IAAI,CAAQ;IACzD,kBAAkB,EAAE,MAAM,CAAM;IAChC,yBAAyB,EAAE,MAAM,CAAM;IACvC,wBAAwB,EAAE,MAAM,CAAM;IACtC,0BAA0B,EAAE,MAAM,CAAM;IACxC,mCAAmC,EAAE,OAAO,CAAS;IACrD,6BAA6B,EAAE,MAAM,EAAE,CAAM;IAG7C,eAAe,EAAE,0BAA0B,GAAG,IAAI,CAAQ;IAC1D,UAAU,EAAE,OAAO,CAAS;IAE7B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlB,IAAI,CAAC,GAAG,GAAE,eAA4B,EAAE,aAAa,CAAC,EAAE,0BAA0B,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAazG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDzC,IAAW,mBAAmB,IAAI,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"storage-admin-dialog.component.d.ts","sourceRoot":"","sources":["../../../src/lib/admin/storage-admin-dialog.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Component, EventEmitter, Input, Output, ViewContainerRef, inject, ChangeDetectorRef, } from '@angular/core';
|
|
2
2
|
import { Metadata, RunView, } from '@memberjunction/core';
|
|
3
3
|
import { FileStorageEngineBase, } from '@memberjunction/core-entities';
|
|
4
|
-
import { UUIDsEqual } from '@memberjunction/global';
|
|
4
|
+
import { CountByUUID, IndexByUUID, UUIDsEqual } from '@memberjunction/global';
|
|
5
5
|
import { MJNotificationService } from '@memberjunction/ng-notifications';
|
|
6
6
|
import { CredentialDialogService } from '@memberjunction/ng-credentials';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
@@ -588,21 +588,25 @@ export class StorageAdminDialogComponent {
|
|
|
588
588
|
// ── Computed Rows & Filters ─────────────────────────────────────────
|
|
589
589
|
get FilteredAccountRows() {
|
|
590
590
|
const term = (this.SearchTerm || '').toLowerCase().trim();
|
|
591
|
+
// Indexed once per evaluation: this getter re-runs on every change-detection pass.
|
|
592
|
+
const providersByID = IndexByUUID(this.Providers);
|
|
593
|
+
const credentialsByID = IndexByUUID(this.Credentials);
|
|
594
|
+
const roleCounts = CountByUUID(this.AccountPermissions, (p) => p.FileStorageAccountID);
|
|
591
595
|
return this.Accounts.filter((a) => {
|
|
592
596
|
if (!term)
|
|
593
597
|
return true;
|
|
594
|
-
const prov =
|
|
595
|
-
const cred =
|
|
598
|
+
const prov = providersByID.Get(a.ProviderID);
|
|
599
|
+
const cred = credentialsByID.Get(a.CredentialID);
|
|
596
600
|
const credName = cred?.Name || '';
|
|
597
601
|
return (a.Name.toLowerCase().includes(term) ||
|
|
598
602
|
(a.Description || '').toLowerCase().includes(term) ||
|
|
599
603
|
(prov?.Name || '').toLowerCase().includes(term) ||
|
|
600
604
|
credName.toLowerCase().includes(term));
|
|
601
605
|
}).map((account) => {
|
|
602
|
-
const provider =
|
|
603
|
-
const credential =
|
|
606
|
+
const provider = providersByID.Get(account.ProviderID);
|
|
607
|
+
const credential = credentialsByID.Get(account.CredentialID);
|
|
604
608
|
const credentialName = credential?.Name;
|
|
605
|
-
const roleCount =
|
|
609
|
+
const roleCount = roleCounts.Get(account.ID) ?? 0;
|
|
606
610
|
return { account, provider, credentialName, roleCount };
|
|
607
611
|
});
|
|
608
612
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-admin-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/admin/storage-admin-dialog.component.ts","../../../src/lib/admin/storage-admin-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,YAAY,EACZ,KAAK,EAEL,MAAM,EACN,gBAAgB,EAChB,MAAM,EACN,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,QAAQ,EACR,OAAO,GAER,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,qBAAqB,GAMtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;;;;;;;;;ICkB3D,kCAAqE;IAA1B,mOAAsB,EAAE,KAAC;IAClE,wBAAiC;IACnC,iBAAS;;;IAeb,+BAA8B;IAC5B,iCAA4D;IAC9D,iBAAM;;;;IAOF,kCAGiC;IAA/B,8NAAS,2BAAoB,KAAC;IAC9B,wBAAgC;IAChC,4BAAM;IAAA,uCAAuB;IAC/B,AAD+B,iBAAO,EAC7B;;;IAXb,0CAGiN;IAC/M,+HAAmB;IASrB,iBAAiB;;;IAVf,AADA,6GAAwF,sNACsH;IAC9M,cAQC;IARD,6CAQC;;;IAuBa,gCAA8B;IAAA,YAA6B;IAAA,iBAAO;;;IAApC,cAA6B;IAA7B,gDAA6B;;;IAY7D,gCAAqG;IACnG,wBAA+B;IAC/B,4BAAM;IAAA,YAAwB;IAChC,AADgC,iBAAO,EAChC;;;IAHgD,8DAA6C;IAE5F,eAAwB;IAAxB,2CAAwB;;;IAGhC,gCAAwF;IACtF,wBAAgD;IAChD,4BAAM;IAAA,6BAAa;IACrB,AADqB,iBAAO,EACrB;;;IAKP,gCAAoD;IAClD,wBAAiC;IACjC,4BAAM;IAAA,uBAAO;IACf,AADe,iBAAO,EACf;;;IAGL,AADF,gCAAqD,WAC7C;IAAA,wBAAQ;IAChB,AADgB,iBAAO,EAChB;;;;IAlCP,AADF,AADF,AADF,0BAAI,SACE,cACgC,eACD;IAAA,YAAsB;IAAA,iBAAO;IAC5D,oIAA+B;IAInC,AADE,iBAAM,EACH;IAEH,AADF,0BAAI,eAC8B;IAC9B,oBAA6E;IAC7E,4BAAM;IAAA,aAAgD;IAE1D,AADE,AADwD,iBAAO,EACxD,EACJ;IACL,2BAAI;IAMA,AALF,sIAA0B,gHAKjB;IAMX,iBAAK;IACL,2BAAI;IAMA,AALF,sIAAyC,gHAKhC;IAKX,iBAAK;IAEH,AADF,2BAAI,gBACgC;IAChC,yBAAuC;IACvC,6BAAM;IAAA,aAAoE;IAE9E,AADE,AAD4E,iBAAO,EAC5E,EACJ;IAGD,AADF,AADF,+BAA0B,eACY,kBAKQ;IAAxC,iPAAS,uCAA6B,KAAC;IACvC,yBAAyC;IAC3C,iBAAS;IACT,mCAI8C;IAA5C,iPAAS,2CAAiC,KAAC;IAC3C,yBAAqC;IAI7C,AADE,AADE,AADE,iBAAS,EACL,EACH,EACF;;;;IA7DgC,eAAsB;IAAtB,yCAAsB;IACrD,cAEC;IAFD,qDAEC;IAKE,eAAqE;IAArE,yHAAqE;IAClE,eAAgD;IAAhD,wGAAgD;IAIxD,eAUC;IAVD,iDAUC;IAGD,eASC;IATD,gEASC;IAKO,eAAoE;IAApE,0FAAoE;;;IArDhF,AADF,AADF,AADF,AADF,+BAAsC,gBACN,YACrB,SACD,SACE;IAAA,4BAAY;IAAA,iBAAK;IACrB,0BAAI;IAAA,wBAAQ;IAAA,iBAAK;IACjB,0BAAI;IAAA,0BAAU;IAAA,iBAAK;IACnB,2BAAI;IAAA,8BAAa;IAAA,iBAAK;IACtB,2BAAI;IAAA,4BAAW;IAAA,iBAAK;IACpB,+BAA0B;IAAA,wBAAO;IAErC,AADE,AADmC,iBAAK,EACnC,EACC;IACR,8BAAO;IACL,iIAkEC;IAGP,AADE,AADE,iBAAQ,EACF,EACJ;;;IArEA,gBAkEC;IAlED,yCAkEC;;;;IA3HP,AADF,AAFF,8BAAyB,cAEY,cACI;IACnC,wBAA4C;IAC5C,iCAG8E;IAD5E,wTAAwB;IAF1B,iBAG8E;IAC9E,gHAAkB;IAKpB,iBAAM;IAEN,kCAGiC;IAA/B,gMAAS,2BAAoB,KAAC;IAC9B,wBAAgC;IAChC,4BAAM;IAAA,mCAAmB;IAE7B,AADE,AAD2B,iBAAO,EACzB,EACL;IAsBJ,AAfA,AAJF,+GAAiB,oGAI8B,0FAetC;IAsFX,iBAAM;;;IA5HE,eAAwB;IAAxB,iDAAwB;IAE1B,cAIC;IAJD,4CAIC;IAaL,eAwGC;IAxGD,2FAwGC;;;IA4CiB,+BAA8B;IAAA,YAAsB;IAAA,iBAAM;;;IAA5B,cAAsB;IAAtB,yCAAsB;;;IAaxD,gCAAuG;IACrG,wBAA4C;IAC5C,4BAAM;IAAA,6BAAa;IACrB,AADqB,iBAAO,EACrB;;;IAGL,AADF,gCAAqD,WAC7C;IAAA,wBAAQ;IAChB,AADgB,iBAAO,EAChB;;;;IAnCP,AADF,AADF,AADF,0BAA6C,SACvC,gBACoG,gBAI1D;IAAxC,mOAAU,oCAA0B,KAAC;IAHvC,iBAG0C;IAC1C,2BAAsC;IAE1C,AADE,iBAAQ,EACL;IAGD,AADF,AADF,0BAAI,cAC4B,cACS;IACnC,oBAA4C;IAC9C,iBAAM;IAEJ,AADF,2BAAK,eAC2B;IAAA,aAAe;IAAA,iBAAM;IACnD,sHAAwB;IAK9B,AADE,AADE,iBAAM,EACF,EACH;IAEH,AADF,2BAAI,gBACyB;IAAA,aAAiC;IAC9D,AAD8D,iBAAO,EAChE;IAEH,AADF,2BAAI,gBACyB;IAAA,aAAiC;IAC9D,AAD8D,iBAAO,EAChE;IACL,2BAAI;IAMA,AALF,uHAA2B,iGAKlB;IAKX,iBAAK;IAEH,AADF,+BAA2B,gBACM;IAAA,aAAmB;IAEtD,AADE,AADoD,iBAAO,EACtD,EACF;;;;IA5CD,oDAAwC;IAER,eAAqE;IAArE,sFAAqE;IAGjG,cAAyB;IAAzB,0CAAyB;IAQtB,eAAoC;IAApC,mDAAoC;IAGT,eAAe;IAAf,kCAAe;IAC7C,cAEC;IAFD,+CAEC;IAKsB,eAAiC;IAAjC,yDAAiC;IAGjC,eAAiC;IAAjC,yDAAiC;IAG5D,eASC;IATD,kDASC;IAG8B,eAAmB;IAAnB,sCAAmB;;;IA7D9D,AADF,8BAAyB,cACS;IAC9B,wBAAuC;IACvC,4BAAM;IAAA,qJAAqI;IAC7I,AAD6I,iBAAO,EAC9I;IAME,AADF,AADF,AADF,AADF,+BAAsC,gBACN,YACrB,SACD,SACE;IAAA,uBAAM;IAAA,iBAAK;IACf,2BAAI;IAAA,gCAAe;IAAA,iBAAK;IACxB,2BAAI;IAAA,kCAAiB;IAAA,iBAAK;IAC1B,2BAAI;IAAA,kCAAiB;IAAA,iBAAK;IAC1B,2BAAI;IAAA,+BAAc;IAAA,iBAAK;IACvB,+BAA2B;IAAA,yBAAQ;IAEvC,AADE,AADqC,iBAAK,EACrC,EACC;IACR,8BAAO;IACL,iHA8CC;IAIT,AADE,AADE,AADE,iBAAQ,EACF,EACJ,EACF;;;IAlDE,gBA8CC;IA9CD,+BA8CC;;;IAgCH,kCAA0B;IAAA,YAAe;IAAA,iBAAS;;;IAA1C,mCAAiB;IAAC,cAAe;IAAf,mCAAe;;;IA0CvC,kCAA0B;IAAA,YAAe;IAAA,iBAAS;;;IAA1C,mCAAiB;IAAC,cAAe;IAAf,mCAAe;;;;IA+BzC,AADF,iCAAkC,gBAIY;IAA1C,qOAAU,uCAA4B,KAAC;IAHzC,iBAG4C;IAC5C,4BAAM;IAAA,YAAe;IACvB,AADuB,iBAAO,EACtB;;;;IAHJ,cAAmC;IAAnC,4DAAmC;IAE/B,eAAe;IAAf,mCAAe;;;IAqBzB,wBAA2C;IAC3C,4BAAM;IAAA,yBAAS;IAAA,iBAAO;;;IAEtB,wBAAiC;IACjC,4BAAM;IAAA,YAAwD;IAAA,iBAAO;;;IAA/D,eAAwD;IAAxD,+EAAwD;;;;IArHtE,qCAIgC;IAA9B,mMAAS,0BAAmB,KAAC;IAKzB,AADF,AAFF,+BAAoC,cAEP,gBACI;IAAA,iCAAiB;IAAA,gCAA0B;IAAA,iBAAC;IAAO,AAAP,iBAAO,EAAQ;IACxF,kCAGgC;IAD9B,qVAAsC;IAEtC,iHAEC;IACH,iBAAS;IACT,gCAA0B;IAAA,yEAAwD;IACpF,AADoF,iBAAM,EACpF;IAIJ,AADF,gCAA2B,iBACI;IAAA,8BAAa;IAAA,iCAA0B;IAAA,kBAAC;IAAO,AAAP,iBAAO,EAAQ;IACpF,kCAI0E;IADxE,yUAAgC;IAEpC,AALE,iBAI0E,EACtE;IAIJ,AADF,gCAA2B,iBACI;IAAA,4BAAW;IAAA,iBAAQ;IAChD,qCAIgG;IAD9F,0VAAuC;IAE3C,AADkG,iBAAW,EACvG;IAKF,AADF,AADF,gCAA2B,eACM,iBACA;IAAA,oCAAmB;IAAA,iBAAQ;IACxD,mCAGyC;IAAvC,iMAAS,mCAA4B,KAAC;IACtC,yBAAgC;IAChC,6BAAM;IAAA,+BAAc;IAExB,AADE,AADsB,iBAAO,EACpB,EACL;IAEJ,AADF,gCAAqC,kBACqC;IAAzC,0VAAwC;IACrE,mCAAiB;IAAA,6CAA4B;IAAA,iBAAS;IACtD,mHAEC;IAEL,AADE,iBAAS,EACL;IACN,gCAA0B;IACxB,gIACF;IACF,AADE,iBAAM,EACF;IAKF,AADF,AADF,gCAAoC,iBACD,iBAGuB;IAApD,2WAAiD;IAFnD,iBAEsD;IACtD,6BAAM;IAAA,yCAAwB;IAChC,AADgC,iBAAO,EAC/B;IACR,gCAA2C;IACzC,gIACF;IACF,AADE,iBAAM,EACF;IAIJ,AADF,gCAA2B,iBACI;IAAA,wCAAuB;IAAA,iBAAQ;IAC5D,gCAA0B;IACxB,8IACF;IAAA,iBAAM;IACN,gCAAgC;IAC9B,kHAQC;IAGP,AADE,AADE,iBAAM,EACF,EACF;IAGJ,AADF,0CAAmB,kBAKe;IAA9B,iMAAS,0BAAmB,KAAC;IAC7B,yBACF;IAAA,iBAAS;IACT,mCAI0B;IAAxB,iMAAS,oBAAa,KAAC;IAIrB,AAHF,oGAAgB,8EAGP;IAMf,AADE,AADE,iBAAS,EACS,EACV;;;IAtHV,AADA,AADA,iDAA4B,gHACqE,cACpF;IASP,eAAsC;IAAtC,+DAAsC;IACtC,kDAA6B;IAC7B,cAEC;IAFD,qCAEC;IAWD,eAAgC;IAAhC,yDAAgC;IAUhC,eAAuC;IAAvC,gEAAuC;IAiBR,gBAAwC;IAAxC,iEAAwC;IAErE,eAEC;IAFD,iCAEC;IAaD,eAAiD;IAAjD,0EAAiD;IAenD,gBAQC;IARD,2BAQC;IASH,eAAqB;IAArB,0CAAqB;IAOrB,eAAgF;IAAhF,mHAAgF;IAEhF,cAMC;IAND,2CAMC;;;IA0CC,wBAA2C;IAC3C,4BAAM;IAAA,2BAAW;IAAA,iBAAO;;;IAExB,wBAAqC;IACrC,4BAAM;IAAA,8BAAc;IAAA,iBAAO;;;;IAtCnC,qCAIkC;IAAhC,oMAAS,4BAAqB,KAAC;IAG7B,AADF,+BAAoC,cACE;IAClC,wBAAgD;IAClD,iBAAM;IAEJ,AADF,+BAAoC,YACC;IACjC,iDAAgC;IAAA,8BAAQ;IAAA,YAA0B;IAAA,iBAAS;IAAA,kBAC7E;IAAA,iBAAI;IACJ,8BAAsC;IACpC,+NACF;IAEJ,AADE,AADE,iBAAI,EACA,EACF;IAGJ,AADF,0CAAmB,kBAKiB;IAAhC,kMAAS,4BAAqB,KAAC;IAC/B,yBACF;IAAA,iBAAS;IACT,mCAImC;IAAjC,kMAAS,6BAAsB,KAAC;IAI9B,AAHF,oGAAkB,8EAGT;IAMf,AADE,AADE,iBAAS,EACS,EACV;;;IAvCV,AAFA,kDAA6B,cAEhB;IASiC,eAA0B;IAA1B,iDAA0B;IAYpE,eAAuB;IAAvB,4CAAuB;IAOvB,eAAuB;IAAvB,4CAAuB;IAEvB,cAMC;IAND,6CAMC;;ADtXT,MAAM,OAAO,2BAA2B;IAC9B,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAChC,aAAa,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAC9C,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC5C,gBAAgB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;IAElD,OAAO,GAAY,KAAK,CAAC;IACzB,SAAS,GAAoB,UAAU,CAAC;IACxC,QAAQ,GAA6B,IAAI,CAAC;IAEzC,KAAK,GAAG,IAAI,YAAY,EAAQ,CAAC;IACjC,eAAe,GAAG,IAAI,YAAY,EAAQ,CAAC;IAErD,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAC5C,CAAC;IAED,uEAAuE;IAChE,SAAS,GAAY,KAAK,CAAC;IAC3B,QAAQ,GAAY,KAAK,CAAC;IAC1B,UAAU,GAAW,EAAE,CAAC;IAExB,SAAS,GAAkC,EAAE,CAAC;IAC9C,QAAQ,GAAiC,EAAE,CAAC;IAC5C,WAAW,GAAyB,EAAE,CAAC;IACvC,KAAK,GAAmB,EAAE,CAAC;IAC3B,kBAAkB,GAA2C,EAAE,CAAC;IAEvE,uEAAuE;IAChE,gBAAgB,GAAY,KAAK,CAAC;IAClC,cAAc,GAAsC,IAAI,CAAC;IACzD,kBAAkB,GAAW,EAAE,CAAC;IAChC,yBAAyB,GAAW,EAAE,CAAC;IACvC,wBAAwB,GAAW,EAAE,CAAC;IACtC,0BAA0B,GAAW,EAAE,CAAC;IACxC,mCAAmC,GAAY,KAAK,CAAC;IACrD,6BAA6B,GAAa,EAAE,CAAC;IAEpD,uEAAuE;IAChE,eAAe,GAAsC,IAAI,CAAC;IAC1D,UAAU,GAAY,KAAK,CAAC;IAEnC,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAuB,UAAU,EAAE,aAAiD;QACpG,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAEzB,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,WAAW;QACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAC9B,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAE5C,kEAAkE;YAClE,MAAM,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,qBAAqB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CACjE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAChF,CAAC;YACF,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,qBAAqB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACzE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAC7B,CAAC;YAEF,mBAAmB;YACnB,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAqB;gBACtD,UAAU,EAAE,iBAAiB;gBAC7B,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YACH,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;YACxC,CAAC;YAED,aAAa;YACb,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAe;gBAChD,UAAU,EAAE,WAAW;gBACvB,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YACH,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC;YAClC,CAAC;YAED,2BAA2B;YAC3B,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAuC;gBACxE,UAAU,EAAE,sCAAsC;gBAClD,UAAU,EAAE,eAAe;aAC5B,CAAC,CAAC;YACH,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,OAAO,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,2DAA2D,EAAE,GAAG,CAAC,CAAC;YAChF,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,uCAAuC,EAAE,OAAO,CAAC,CAAC;QAChG,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,uEAAuE;IAEvE,IAAW,mBAAmB;QAC5B,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAE1D,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAChC,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;YACxE,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;YAClC,OAAO,CACL,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACnC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAClD,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC/C,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CACtC,CAAC;QACJ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YAClF,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;YACxF,MAAM,cAAc,GAAG,UAAU,EAAE,IAAI,CAAC;YACxC,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAoB,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/G,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC;QAC1D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,uEAAuE;IAEhE,kBAAkB;QACvB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,yBAAyB,GAAG,EAAE,CAAC;QACpC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7F,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC;QACrC,IAAI,CAAC,mCAAmC,GAAG,KAAK,CAAC;QACjD,IAAI,CAAC,6BAA6B,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,gBAAgB,CAAC,OAAmC;QACzD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,yBAAyB,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;QAC3D,IAAI,CAAC,wBAAwB,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,0BAA0B,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QAC7D,IAAI,CAAC,mCAAmC,GAAG,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC;QAE3E,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAoB,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3G,IAAI,CAAC,6BAA6B,GAAG,YAAY;aAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;aACpB,MAAM,CAAC,CAAC,MAAM,EAAoB,EAAE,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,CAAC,CAAC;QAEjF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,iBAAiB;QACtB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,mBAAmB,CAAC,MAAc;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;QACzF,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,6BAA6B,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAEM,cAAc,CAAC,MAAc;QAClC,OAAO,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACjF,CAAC;IAEM,KAAK,CAAC,0BAA0B;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC3E,KAAK,EAAE,uCAAuC;aAC/C,CAAC,CAAC;YACH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACxC,2BAA2B;gBAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;gBAC9B,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;gBAC5C,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,OAAO,CAAqB;oBACtD,UAAU,EAAE,iBAAiB;oBAC7B,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,eAAe;iBAC5B,CAAC,CAAC;gBACH,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvB,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;gBACxC,CAAC;gBACD,IAAI,CAAC,0BAA0B,GAAG,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvD,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,eAAe,MAAM,CAAC,UAAU,CAAC,IAAI,YAAY,EAAE,SAAS,CAAC,CAAC;gBAC1G,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,0DAA0D,EAAE,GAAG,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,WAAW;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;YACpF,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC;YACnC,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,+BAA+B,EAAE,SAAS,CAAC,CAAC;YACxF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;YAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC;YAC5B,IAAI,aAAyC,CAAC;YAE9C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,aAAa,GAAG,MAAM,EAAE,CAAC,eAAe,CACtC,2BAA2B,EAC3B,IAAI,CACL,CAAC;YACJ,CAAC;YAED,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;YAC1B,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;YAC1E,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAAC;YACzD,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC,0BAA0B,IAAI,EAAE,CAAC;YACnE,aAAa,CAAC,qBAAqB,GAAG,IAAI,CAAC,mCAAmC,CAAC;YAE/E,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO,IAAI,iCAAiC,CAAC,CAAC;YAC5F,CAAC;YAED,wBAAwB;YACxB,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAExF,uBAAuB;YACvB,MAAM,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAEzB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,oBAAoB,IAAI,uBAAuB,EAAE,SAAS,CAAC,CAAC;QAC1G,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,qDAAqD,EAAE,GAAG,CAAC,CAAC;YAC1E,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC,CAAC;YACnF,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,SAAiB,EAAE,cAAwB;QAC9E,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC;QAE5B,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC,CAAC;QAC3G,MAAM,eAAe,GAAG,IAAI,GAAG,EAAgD,CAAC;QAChF,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBACb,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,0CAA0C;QAC1C,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC1E,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,eAAe,CACtC,sCAAsC,EACtC,IAAI,CACL,CAAC;gBACF,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;gBACzC,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC;gBACtB,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;gBACxB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;gBACvB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACxB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,uEAAuE;IAEhE,oBAAoB,CAAC,OAAmC;QAC7D,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,mBAAmB;QACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,oBAAoB;QAC/B,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QAClC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YAE1C,sCAAsC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAC,CAAC;YACnG,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;YACnB,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YACpD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;YAED,MAAM,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;YAEzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,oBAAoB,WAAW,YAAY,EAAE,MAAM,CAAC,CAAC;QACnG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC;YAClE,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC,CAAC;YACrF,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,uEAAuE;IAEhE,KAAK,CAAC,oBAAoB,CAAC,QAAqC;QACrE,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACpC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,QAAQ,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC,WAAW;gBAC1C,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,IAAI,mCAAmC,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,wBAAwB,CACzC,aAAa,QAAQ,CAAC,IAAI,YAAY,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,EACzE,MAAM,CACP,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sDAAsD,EAAE,GAAG,CAAC,CAAC;YAC3E,IAAI,CAAC,aAAa,CAAC,wBAAwB,CAAC,mCAAmC,EAAE,OAAO,CAAC,CAAC;QAC5F,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,uEAAuE;IAEhE,eAAe,CAAC,YAAoB;QACzC,MAAM,IAAI,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,kBAAkB,CAAC;QAC3E,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,wBAAwB,CAAC;QAC5D,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,OAAO,2BAA2B,CAAC;QACtE,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;YAAE,OAAO,qBAAqB,CAAC;QAChE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YAAE,OAAO,sBAAsB,CAAC;QAC5D,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,iBAAiB,CAAC;QACnD,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,wBAAwB,CAAC;QAC9F,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAEM,aAAa;QAClB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;qHA1ZU,2BAA2B;6DAA3B,2BAA2B;YC1CxC,oCAK4B;YAA1B,2GAAS,mBAAe,IAAC;YAKrB,AADF,AAFF,8BAAwC,aAEH,gBAKE;YAAjC,wHAAqB,UAAU,IAAC;YAChC,uBAAkC;YAClC,4BAAM;YAAA,gCAAgB;YAAA,iBAAO;YAC7B,+BAA2B;YAAA,YAAqB;YAClD,AADkD,iBAAO,EAChD;YAET,iCAIoC;YAAlC,wHAAqB,WAAW,IAAC;YACjC,wBAAiC;YACjC,6BAAM;YAAA,kCAAiB;YAAA,iBAAO;YAC9B,gCAA2B;YAAA,aAAsB;YAErD,AADE,AADmD,iBAAO,EACjD,EACL;YAGN,gGAAgC;YAwIhC,gGAAiC;YAwEnC,iBAAM;YAGJ,AADF,0CAAmB,iBAC2E;YAA1B,yGAAS,mBAAe,IAAC;YACzF,wBACF;YAEJ,AADE,AADE,iBAAS,EACS,EACV;YAGZ,uGAAwB;YA8HxB,uGAAuB;;YApXrB,AADA,AAFA,qCAAmB,cAEN,iBACG;YASV,eAAyC;YAAzC,sDAAyC;YAId,eAAqB;YAArB,yCAAqB;YAMhD,cAA0C;YAA1C,uDAA0C;YAIf,eAAsB;YAAtB,0CAAsB;YAKrD,cAqIC;YArID,wDAqIC;YAGD,cAuEC;YAvED,yDAuEC;YAWL,eA2HC;YA3HD,gDA2HC;YAGD,cA4CC;YA5CD,+CA4CC;;;iFD1XY,2BAA2B;cANvC,SAAS;6BACI,KAAK,YACP,yBAAyB;;kBAUlC,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kFAXI,2BAA2B","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewContainerRef,\n inject,\n ChangeDetectorRef,\n} from '@angular/core';\nimport {\n Metadata,\n RunView,\n type IMetadataProvider,\n} from '@memberjunction/core';\nimport {\n FileStorageEngineBase,\n MJFileStorageAccountEntity,\n MJFileStorageProviderEntity,\n MJFileStorageAccountPermissionEntity,\n MJCredentialEntity,\n MJRoleEntity,\n} from '@memberjunction/core-entities';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CredentialDialogService } from '@memberjunction/ng-credentials';\n\nexport type StorageAdminTab = 'accounts' | 'providers';\n\nexport interface StorageAccountRow {\n account: MJFileStorageAccountEntity;\n provider?: MJFileStorageProviderEntity;\n credentialName?: string;\n roleCount: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-storage-admin-dialog',\n templateUrl: './storage-admin-dialog.component.html',\n styleUrls: ['./storage-admin-dialog.component.css'],\n})\nexport class StorageAdminDialogComponent implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n private viewContainerRef = inject(ViewContainerRef);\n private credentialDialog = inject(CredentialDialogService);\n\n @Input() Visible: boolean = false;\n @Input() ActiveTab: StorageAdminTab = 'accounts';\n @Input() Provider: IMetadataProvider | null = null;\n\n @Output() Close = new EventEmitter<void>();\n @Output() AccountsChanged = new EventEmitter<void>();\n\n public get ProviderToUse(): IMetadataProvider {\n return this.Provider ?? Metadata.Provider;\n }\n\n // ── State ───────────────────────────────────────────────────────────\n public IsLoading: boolean = false;\n public IsSaving: boolean = false;\n public SearchTerm: string = '';\n\n public Providers: MJFileStorageProviderEntity[] = [];\n public Accounts: MJFileStorageAccountEntity[] = [];\n public Credentials: MJCredentialEntity[] = [];\n public Roles: MJRoleEntity[] = [];\n public AccountPermissions: MJFileStorageAccountPermissionEntity[] = [];\n\n // ── Account Editor Sub-View / Modal ─────────────────────────────────\n public IsEditingAccount: boolean = false;\n public EditingAccount: MJFileStorageAccountEntity | null = null;\n public EditingAccountName: string = '';\n public EditingAccountDescription: string = '';\n public EditingAccountProviderID: string = '';\n public EditingAccountCredentialID: string = '';\n public EditingAccountIncludeInGlobalSearch: boolean = false;\n public EditingAccountSelectedRoleIDs: string[] = [];\n\n // ── Delete Confirmation ─────────────────────────────────────────────\n public AccountToDelete: MJFileStorageAccountEntity | null = null;\n public IsDeleting: boolean = false;\n\n async ngOnInit(): Promise<void> {\n if (this.Visible) {\n await this.LoadAllData();\n }\n }\n\n public async Open(tab: StorageAdminTab = 'accounts', accountToEdit?: MJFileStorageAccountEntity | null): Promise<void> {\n this.ActiveTab = tab;\n this.Visible = true;\n this.IsEditingAccount = false;\n this.AccountToDelete = null;\n await this.LoadAllData();\n\n if (accountToEdit) {\n this.StartEditAccount(accountToEdit);\n }\n this.cdr.markForCheck();\n }\n\n public async LoadAllData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n\n // Load providers and accounts via FileStorageEngineBase + RunView\n await FileStorageEngineBase.Instance.Config(true);\n this.Providers = [...FileStorageEngineBase.Instance.Providers].sort(\n (a, b) => (a.Priority ?? 0) - (b.Priority ?? 0) || a.Name.localeCompare(b.Name)\n );\n this.Accounts = [...FileStorageEngineBase.Instance.Accounts].sort((a, b) =>\n a.Name.localeCompare(b.Name)\n );\n\n // Load Credentials\n const credResult = await rv.RunView<MJCredentialEntity>({\n EntityName: 'MJ: Credentials',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n if (credResult.Success) {\n this.Credentials = credResult.Results;\n }\n\n // Load Roles\n const roleResult = await rv.RunView<MJRoleEntity>({\n EntityName: 'MJ: Roles',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n if (roleResult.Success) {\n this.Roles = roleResult.Results;\n }\n\n // Load Account Permissions\n const permResult = await rv.RunView<MJFileStorageAccountPermissionEntity>({\n EntityName: 'MJ: File Storage Account Permissions',\n ResultType: 'entity_object',\n });\n if (permResult.Success) {\n this.AccountPermissions = permResult.Results;\n }\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Error loading storage data:', err);\n this.notifications.CreateSimpleNotification('Failed to load storage configuration.', 'error');\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n // ── Computed Rows & Filters ─────────────────────────────────────────\n\n public get FilteredAccountRows(): StorageAccountRow[] {\n const term = (this.SearchTerm || '').toLowerCase().trim();\n\n return this.Accounts.filter((a) => {\n if (!term) return true;\n const prov = this.Providers.find((p) => UUIDsEqual(p.ID, a.ProviderID));\n const cred = this.Credentials.find((c) => UUIDsEqual(c.ID, a.CredentialID));\n const credName = cred?.Name || '';\n return (\n a.Name.toLowerCase().includes(term) ||\n (a.Description || '').toLowerCase().includes(term) ||\n (prov?.Name || '').toLowerCase().includes(term) ||\n credName.toLowerCase().includes(term)\n );\n }).map((account) => {\n const provider = this.Providers.find((p) => UUIDsEqual(p.ID, account.ProviderID));\n const credential = this.Credentials.find((c) => UUIDsEqual(c.ID, account.CredentialID));\n const credentialName = credential?.Name;\n const roleCount = this.AccountPermissions.filter((p) => UUIDsEqual(p.FileStorageAccountID, account.ID)).length;\n return { account, provider, credentialName, roleCount };\n });\n }\n\n public get ActiveProviders(): MJFileStorageProviderEntity[] {\n return this.Providers.filter((p) => p.IsActive);\n }\n\n // ── Account Editing ─────────────────────────────────────────────────\n\n public StartCreateAccount(): void {\n this.EditingAccount = null;\n this.EditingAccountName = '';\n this.EditingAccountDescription = '';\n this.EditingAccountProviderID = this.ActiveProviders[0]?.ID || (this.Providers[0]?.ID ?? '');\n this.EditingAccountCredentialID = '';\n this.EditingAccountIncludeInGlobalSearch = false;\n this.EditingAccountSelectedRoleIDs = [];\n this.IsEditingAccount = true;\n this.cdr.markForCheck();\n }\n\n public StartEditAccount(account: MJFileStorageAccountEntity): void {\n this.EditingAccount = account;\n this.EditingAccountName = account.Name || '';\n this.EditingAccountDescription = account.Description || '';\n this.EditingAccountProviderID = account.ProviderID || '';\n this.EditingAccountCredentialID = account.CredentialID || '';\n this.EditingAccountIncludeInGlobalSearch = !!account.IncludeInGlobalSearch;\n\n const accountPerms = this.AccountPermissions.filter((p) => UUIDsEqual(p.FileStorageAccountID, account.ID));\n this.EditingAccountSelectedRoleIDs = accountPerms\n .map((p) => p.RoleID)\n .filter((roleId): roleId is string => roleId !== null && roleId !== undefined);\n\n this.IsEditingAccount = true;\n this.cdr.markForCheck();\n }\n\n public CancelEditAccount(): void {\n this.IsEditingAccount = false;\n this.EditingAccount = null;\n this.cdr.markForCheck();\n }\n\n public ToggleRoleSelection(roleId: string): void {\n const idx = this.EditingAccountSelectedRoleIDs.findIndex((id) => UUIDsEqual(id, roleId));\n if (idx >= 0) {\n this.EditingAccountSelectedRoleIDs.splice(idx, 1);\n } else {\n this.EditingAccountSelectedRoleIDs.push(roleId);\n }\n }\n\n public IsRoleSelected(roleId: string): boolean {\n return this.EditingAccountSelectedRoleIDs.some((id) => UUIDsEqual(id, roleId));\n }\n\n public async OpenCreateCredentialDialog(): Promise<void> {\n try {\n const result = await this.credentialDialog.openDialog(this.viewContainerRef, {\n title: 'Create Credential for Storage Account',\n });\n if (result.success && result.credential) {\n // Refresh credentials list\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const credResult = await rv.RunView<MJCredentialEntity>({\n EntityName: 'MJ: Credentials',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n if (credResult.Success) {\n this.Credentials = credResult.Results;\n }\n this.EditingAccountCredentialID = result.credential.ID;\n this.notifications.CreateSimpleNotification(`Credential \"${result.credential.Name}\" created.`, 'success');\n this.cdr.markForCheck();\n }\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Error creating credential:', err);\n }\n }\n\n public async SaveAccount(): Promise<void> {\n const name = this.EditingAccountName.trim();\n if (!name) {\n this.notifications.CreateSimpleNotification('Account name is required.', 'warning');\n return;\n }\n if (!this.EditingAccountProviderID) {\n this.notifications.CreateSimpleNotification('Storage provider is required.', 'warning');\n return;\n }\n\n this.IsSaving = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const user = md.CurrentUser;\n let accountEntity: MJFileStorageAccountEntity;\n\n if (this.EditingAccount) {\n accountEntity = this.EditingAccount;\n } else {\n accountEntity = await md.GetEntityObject<MJFileStorageAccountEntity>(\n 'MJ: File Storage Accounts',\n user\n );\n }\n\n accountEntity.Name = name;\n accountEntity.Description = this.EditingAccountDescription.trim() || null;\n accountEntity.ProviderID = this.EditingAccountProviderID;\n accountEntity.CredentialID = this.EditingAccountCredentialID || '';\n accountEntity.IncludeInGlobalSearch = this.EditingAccountIncludeInGlobalSearch;\n\n const saved = await accountEntity.Save();\n if (!saved) {\n throw new Error(accountEntity.LatestResult?.Message || 'Failed to save storage account.');\n }\n\n // Sync Role Permissions\n await this.syncAccountPermissions(accountEntity.ID, this.EditingAccountSelectedRoleIDs);\n\n // Force engine refresh\n await FileStorageEngineBase.Instance.Config(true);\n await this.LoadAllData();\n\n this.IsEditingAccount = false;\n this.EditingAccount = null;\n this.AccountsChanged.emit();\n this.notifications.CreateSimpleNotification(`Storage account \"${name}\" saved successfully.`, 'success');\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Error saving account:', err);\n const msg = err instanceof Error ? err.message : 'Failed to save storage account.';\n this.notifications.CreateSimpleNotification(msg, 'error');\n } finally {\n this.IsSaving = false;\n this.cdr.markForCheck();\n }\n }\n\n private async syncAccountPermissions(accountId: string, desiredRoleIds: string[]): Promise<void> {\n const md = this.ProviderToUse;\n const user = md.CurrentUser;\n\n const existingPerms = this.AccountPermissions.filter((p) => UUIDsEqual(p.FileStorageAccountID, accountId));\n const existingRoleMap = new Map<string, MJFileStorageAccountPermissionEntity>();\n for (const p of existingPerms) {\n if (p.RoleID) {\n existingRoleMap.set(p.RoleID, p);\n }\n }\n\n // Delete permissions for unselected roles\n for (const p of existingPerms) {\n if (!p.RoleID || !desiredRoleIds.some((rId) => UUIDsEqual(rId, p.RoleID))) {\n await p.Delete();\n }\n }\n\n // Add permissions for newly selected roles\n for (const roleId of desiredRoleIds) {\n if (!existingRoleMap.has(roleId)) {\n const newPerm = await md.GetEntityObject<MJFileStorageAccountPermissionEntity>(\n 'MJ: File Storage Account Permissions',\n user\n );\n newPerm.FileStorageAccountID = accountId;\n newPerm.Type = 'Role';\n newPerm.RoleID = roleId;\n newPerm.CanRead = true;\n newPerm.CanWrite = true;\n await newPerm.Save();\n }\n }\n }\n\n // ── Account Deletion ────────────────────────────────────────────────\n\n public ConfirmDeleteAccount(account: MJFileStorageAccountEntity): void {\n this.AccountToDelete = account;\n this.cdr.markForCheck();\n }\n\n public CancelDeleteAccount(): void {\n this.AccountToDelete = null;\n this.cdr.markForCheck();\n }\n\n public async ExecuteDeleteAccount(): Promise<void> {\n if (!this.AccountToDelete) return;\n this.IsDeleting = true;\n this.cdr.markForCheck();\n\n try {\n const accountName = this.AccountToDelete.Name;\n const accountId = this.AccountToDelete.ID;\n\n // Delete associated permissions first\n const perms = this.AccountPermissions.filter((p) => UUIDsEqual(p.FileStorageAccountID, accountId));\n for (const p of perms) {\n await p.Delete();\n }\n\n const deleted = await this.AccountToDelete.Delete();\n if (!deleted) {\n throw new Error('Failed to delete storage account.');\n }\n\n await FileStorageEngineBase.Instance.Config(true);\n await this.LoadAllData();\n\n this.AccountToDelete = null;\n this.AccountsChanged.emit();\n this.notifications.CreateSimpleNotification(`Storage account \"${accountName}\" removed.`, 'info');\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Delete error:', err);\n const msg = err instanceof Error ? err.message : 'Failed to delete storage account.';\n this.notifications.CreateSimpleNotification(msg, 'error');\n } finally {\n this.IsDeleting = false;\n this.cdr.markForCheck();\n }\n }\n\n // ── Provider Management ─────────────────────────────────────────────\n\n public async ToggleProviderActive(provider: MJFileStorageProviderEntity): Promise<void> {\n const newState = !provider.IsActive;\n provider.IsActive = newState;\n this.cdr.markForCheck();\n\n try {\n const saved = await provider.Save();\n if (!saved) {\n provider.IsActive = !newState; // rollback\n throw new Error(provider.LatestResult?.Message || 'Failed to update provider status.');\n }\n await FileStorageEngineBase.Instance.Config(true);\n this.AccountsChanged.emit();\n this.notifications.CreateSimpleNotification(\n `Provider \"${provider.Name}\" is now ${newState ? 'active' : 'inactive'}.`,\n 'info'\n );\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Provider toggle error:', err);\n this.notifications.CreateSimpleNotification('Failed to update provider status.', 'error');\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n // ── UI Helpers ──────────────────────────────────────────────────────\n\n public GetProviderIcon(providerName: string): string {\n const name = (providerName || '').toLowerCase();\n if (name.includes('aws') || name.includes('s3')) return 'fa-brands fa-aws';\n if (name.includes('azure')) return 'fa-brands fa-microsoft';\n if (name.includes('google drive')) return 'fa-brands fa-google-drive';\n if (name.includes('google cloud')) return 'fa-brands fa-google';\n if (name.includes('dropbox')) return 'fa-brands fa-dropbox';\n if (name.includes('box')) return 'fa-solid fa-box';\n if (name.includes('sharepoint') || name.includes('onedrive')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-cloud';\n }\n\n public OnDialogClose(): void {\n this.Visible = false;\n this.IsEditingAccount = false;\n this.AccountToDelete = null;\n this.Close.emit();\n }\n}\n","<mj-dialog\n [Visible]=\"Visible\"\n Title=\"Manage File Storage\"\n [Width]=\"880\"\n [MinWidth]=\"600\"\n (Close)=\"OnDialogClose()\">\n\n <div class=\"mj-storage-admin-container\">\n <!-- Tab Navigation -->\n <div class=\"mj-storage-admin-tabs\">\n <button\n type=\"button\"\n class=\"mj-tab-btn\"\n [class.active]=\"ActiveTab === 'accounts'\"\n (click)=\"ActiveTab = 'accounts'\">\n <i class=\"fa-solid fa-server\"></i>\n <span>Storage Accounts</span>\n <span class=\"mj-tab-count\">{{ Accounts.length }}</span>\n </button>\n\n <button\n type=\"button\"\n class=\"mj-tab-btn\"\n [class.active]=\"ActiveTab === 'providers'\"\n (click)=\"ActiveTab = 'providers'\">\n <i class=\"fa-solid fa-cubes\"></i>\n <span>Storage Providers</span>\n <span class=\"mj-tab-count\">{{ Providers.length }}</span>\n </button>\n </div>\n\n <!-- ── TAB 1: STORAGE ACCOUNTS ────────────────────────────────────── -->\n @if (ActiveTab === 'accounts') {\n <div class=\"mj-tab-pane\">\n <!-- Toolbar -->\n <div class=\"mj-admin-pane-toolbar\">\n <div class=\"mj-admin-search-wrapper\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"SearchTerm\"\n placeholder=\"Search storage accounts by name, provider, or credential...\" />\n @if (SearchTerm) {\n <button type=\"button\" class=\"mj-clear-btn\" (click)=\"SearchTerm = ''\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-primary\"\n (click)=\"StartCreateAccount()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Add Storage Account</span>\n </button>\n </div>\n\n <!-- Loading -->\n @if (IsLoading) {\n <div class=\"mj-admin-loading\">\n <mj-loading text=\"Loading storage accounts...\"></mj-loading>\n </div>\n } @else if (FilteredAccountRows.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-folder-plus\"\n [Title]=\"SearchTerm ? 'No matching storage accounts' : 'No storage accounts configured'\"\n [Message]=\"SearchTerm ? 'Try adjusting your search query.' : 'Configure storage accounts to connect MemberJunction to cloud storage services like AWS S3, Azure Blob Storage, Box, Dropbox, or Google Drive.'\">\n @if (!SearchTerm) {\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-primary mj-empty-cta\"\n (click)=\"StartCreateAccount()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Configure First Account</span>\n </button>\n }\n </mj-empty-state>\n } @else {\n <!-- Accounts List -->\n <div class=\"mj-admin-table-container\">\n <table class=\"mj-admin-table\">\n <thead>\n <tr>\n <th>Account Name</th>\n <th>Provider</th>\n <th>Credential</th>\n <th>Global Search</th>\n <th>Role Access</th>\n <th class=\"mj-text-right\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredAccountRows; track row.account.ID) {\n <tr>\n <td>\n <div class=\"mj-account-name-cell\">\n <span class=\"mj-account-title\">{{ row.account.Name }}</span>\n @if (row.account.Description) {\n <span class=\"mj-account-desc\">{{ row.account.Description }}</span>\n }\n </div>\n </td>\n <td>\n <span class=\"mj-provider-badge\">\n <i [class]=\"GetProviderIcon(row.provider?.Name || row.account.Provider)\"></i>\n <span>{{ row.provider?.Name || row.account.Provider }}</span>\n </span>\n </td>\n <td>\n @if (row.credentialName) {\n <span class=\"mj-status-badge mj-status-badge--success\" [title]=\"'Credential: ' + row.credentialName\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ row.credentialName }}</span>\n </span>\n } @else {\n <span class=\"mj-status-badge mj-status-badge--warning\" title=\"No credential configured\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>No Credential</span>\n </span>\n }\n </td>\n <td>\n @if (row.account.IncludeInGlobalSearch) {\n <span class=\"mj-status-badge mj-status-badge--info\">\n <i class=\"fa-solid fa-check\"></i>\n <span>Enabled</span>\n </span>\n } @else {\n <span class=\"mj-status-badge mj-status-badge--muted\">\n <span>Disabled</span>\n </span>\n }\n </td>\n <td>\n <span class=\"mj-role-count-badge\">\n <i class=\"fa-solid fa-user-shield\"></i>\n <span>{{ row.roleCount === 0 ? 'All Users' : row.roleCount + ' Role(s)' }}</span>\n </span>\n </td>\n <td class=\"mj-text-right\">\n <div class=\"mj-action-button-group\">\n <button\n type=\"button\"\n class=\"mj-action-icon-btn\"\n title=\"Edit Account\"\n (click)=\"StartEditAccount(row.account)\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n <button\n type=\"button\"\n class=\"mj-action-icon-btn mj-action-icon-btn--danger\"\n title=\"Delete Account\"\n (click)=\"ConfirmDeleteAccount(row.account)\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n <!-- ── TAB 2: STORAGE PROVIDERS ────────────────────────────────────── -->\n @if (ActiveTab === 'providers') {\n <div class=\"mj-tab-pane\">\n <div class=\"mj-admin-pane-desc\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span>Enable or disable storage provider integrations for your organization. Only active providers are available when configuring accounts.</span>\n </div>\n\n <div class=\"mj-admin-table-container\">\n <table class=\"mj-admin-table\">\n <thead>\n <tr>\n <th>Status</th>\n <th>Provider Driver</th>\n <th>Server Driver Key</th>\n <th>Client Driver Key</th>\n <th>Search Support</th>\n <th class=\"mj-text-center\">Priority</th>\n </tr>\n </thead>\n <tbody>\n @for (prov of Providers; track prov.ID) {\n <tr [class.mj-row-inactive]=\"!prov.IsActive\">\n <td>\n <label class=\"mj-toggle-switch\" [title]=\"prov.IsActive ? 'Deactivate provider' : 'Activate provider'\">\n <input\n type=\"checkbox\"\n [checked]=\"prov.IsActive\"\n (change)=\"ToggleProviderActive(prov)\" />\n <span class=\"mj-toggle-slider\"></span>\n </label>\n </td>\n <td>\n <div class=\"mj-provider-cell\">\n <div class=\"mj-provider-icon-circle\">\n <i [class]=\"GetProviderIcon(prov.Name)\"></i>\n </div>\n <div>\n <div class=\"mj-provider-name\">{{ prov.Name }}</div>\n @if (prov.Description) {\n <div class=\"mj-provider-desc\">{{ prov.Description }}</div>\n }\n </div>\n </div>\n </td>\n <td>\n <code class=\"mj-code-pill\">{{ prov.ServerDriverKey || '—' }}</code>\n </td>\n <td>\n <code class=\"mj-code-pill\">{{ prov.ClientDriverKey || '—' }}</code>\n </td>\n <td>\n @if (prov.SupportsSearch) {\n <span class=\"mj-status-badge mj-status-badge--success\" title=\"Provider supports full-text file search\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>Native Search</span>\n </span>\n } @else {\n <span class=\"mj-status-badge mj-status-badge--muted\">\n <span>Standard</span>\n </span>\n }\n </td>\n <td class=\"mj-text-center\">\n <span class=\"mj-priority-pill\">{{ prov.Priority }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n </div>\n\n <mj-dialog-actions>\n <button type=\"button\" class=\"mj-admin-btn mj-admin-btn-secondary\" (click)=\"OnDialogClose()\">\n Close\n </button>\n </mj-dialog-actions>\n</mj-dialog>\n\n<!-- ── ACCOUNT CREATE / EDIT SUB-DIALOG ──────────────────────────────── -->\n@if (IsEditingAccount) {\n <mj-dialog\n [Visible]=\"IsEditingAccount\"\n [Title]=\"EditingAccount ? 'Edit Storage Account: ' + EditingAccount.Name : 'Add Storage Account'\"\n [Width]=\"640\"\n (Close)=\"CancelEditAccount()\">\n\n <div class=\"mj-account-editor-form\">\n <!-- Provider Selection -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Storage Provider <span class=\"mj-required\">*</span></label>\n <select\n class=\"mj-form-select\"\n [(ngModel)]=\"EditingAccountProviderID\"\n [disabled]=\"!!EditingAccount\">\n @for (prov of ActiveProviders; track prov.ID) {\n <option [value]=\"prov.ID\">{{ prov.Name }}</option>\n }\n </select>\n <div class=\"mj-form-hint\">Select the cloud storage engine driver for this account.</div>\n </div>\n\n <!-- Account Name -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Account Name <span class=\"mj-required\">*</span></label>\n <input\n type=\"text\"\n class=\"mj-form-input\"\n [(ngModel)]=\"EditingAccountName\"\n placeholder=\"e.g., Corporate Azure Blob Storage, Marketing S3 Bucket\" />\n </div>\n\n <!-- Account Description -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Description</label>\n <textarea\n class=\"mj-form-textarea\"\n rows=\"2\"\n [(ngModel)]=\"EditingAccountDescription\"\n placeholder=\"Optional notes or details about the intended purpose of this storage account...\"></textarea>\n </div>\n\n <!-- Credential Picker with Inline Create -->\n <div class=\"mj-form-group\">\n <div class=\"mj-form-label-row\">\n <label class=\"mj-form-label\">Storage Credentials</label>\n <button\n type=\"button\"\n class=\"mj-admin-btn-link\"\n (click)=\"OpenCreateCredentialDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Credential</span>\n </button>\n </div>\n <div class=\"mj-credential-input-row\">\n <select class=\"mj-form-select\" [(ngModel)]=\"EditingAccountCredentialID\">\n <option value=\"\">-- No Credential Assigned --</option>\n @for (cred of Credentials; track cred.ID) {\n <option [value]=\"cred.ID\">{{ cred.Name }}</option>\n }\n </select>\n </div>\n <div class=\"mj-form-hint\">\n Credentials manage authentication tokens, connection strings, or API keys securely via the Credential Engine.\n </div>\n </div>\n\n <!-- Global Search Toggle -->\n <div class=\"mj-form-checkbox-group\">\n <label class=\"mj-checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"EditingAccountIncludeInGlobalSearch\" />\n <span>Include in Global Search</span>\n </label>\n <div class=\"mj-form-hint mj-checkbox-hint\">\n When enabled, file contents and metadata in this account will be indexed for universal MemberJunction search.\n </div>\n </div>\n\n <!-- Role Permissions -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Role Access Permissions</label>\n <div class=\"mj-form-hint\">\n Select specific roles permitted to access this storage account. If no roles are selected, all authorized users have access.\n </div>\n <div class=\"mj-roles-checklist\">\n @for (role of Roles; track role.ID) {\n <label class=\"mj-role-check-item\">\n <input\n type=\"checkbox\"\n [checked]=\"IsRoleSelected(role.ID)\"\n (change)=\"ToggleRoleSelection(role.ID)\" />\n <span>{{ role.Name }}</span>\n </label>\n }\n </div>\n </div>\n </div>\n\n <mj-dialog-actions>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-secondary\"\n [disabled]=\"IsSaving\"\n (click)=\"CancelEditAccount()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-primary\"\n [disabled]=\"IsSaving || !EditingAccountName.trim() || !EditingAccountProviderID\"\n (click)=\"SaveAccount()\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Saving...</span>\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n <span>{{ EditingAccount ? 'Save Changes' : 'Create Account' }}</span>\n }\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- ── DELETE CONFIRMATION DIALOG ────────────────────────────────────── -->\n@if (AccountToDelete) {\n <mj-dialog\n [Visible]=\"!!AccountToDelete\"\n Title=\"Delete Storage Account\"\n [Width]=\"460\"\n (Close)=\"CancelDeleteAccount()\">\n\n <div class=\"mj-delete-confirm-body\">\n <div class=\"mj-delete-confirm-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <div class=\"mj-delete-confirm-text\">\n <p class=\"mj-delete-confirm-title\">\n Are you sure you want to delete <strong>{{ AccountToDelete.Name }}</strong>?\n </p>\n <p class=\"mj-delete-confirm-subtitle\">\n This will remove the storage account connection and role permissions. Existing files in the remote storage service will not be deleted, but will no longer be accessible via this account in MemberJunction.\n </p>\n </div>\n </div>\n\n <mj-dialog-actions>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-secondary\"\n [disabled]=\"IsDeleting\"\n (click)=\"CancelDeleteAccount()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-danger\"\n [disabled]=\"IsDeleting\"\n (click)=\"ExecuteDeleteAccount()\">\n @if (IsDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Deleting...</span>\n } @else {\n <i class=\"fa-solid fa-trash-can\"></i>\n <span>Delete Account</span>\n }\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"storage-admin-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/admin/storage-admin-dialog.component.ts","../../../src/lib/admin/storage-admin-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnInit,\n Output,\n ViewContainerRef,\n inject,\n ChangeDetectorRef,\n} from '@angular/core';\nimport {\n Metadata,\n RunView,\n type IMetadataProvider,\n} from '@memberjunction/core';\nimport {\n FileStorageEngineBase,\n MJFileStorageAccountEntity,\n MJFileStorageProviderEntity,\n MJFileStorageAccountPermissionEntity,\n MJCredentialEntity,\n MJRoleEntity,\n} from '@memberjunction/core-entities';\nimport { CountByUUID, IndexByUUID, UUIDsEqual } from '@memberjunction/global';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { CredentialDialogService } from '@memberjunction/ng-credentials';\n\nexport type StorageAdminTab = 'accounts' | 'providers';\n\nexport interface StorageAccountRow {\n account: MJFileStorageAccountEntity;\n provider?: MJFileStorageProviderEntity;\n credentialName?: string;\n roleCount: number;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-storage-admin-dialog',\n templateUrl: './storage-admin-dialog.component.html',\n styleUrls: ['./storage-admin-dialog.component.css'],\n})\nexport class StorageAdminDialogComponent implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n private viewContainerRef = inject(ViewContainerRef);\n private credentialDialog = inject(CredentialDialogService);\n\n @Input() Visible: boolean = false;\n @Input() ActiveTab: StorageAdminTab = 'accounts';\n @Input() Provider: IMetadataProvider | null = null;\n\n @Output() Close = new EventEmitter<void>();\n @Output() AccountsChanged = new EventEmitter<void>();\n\n public get ProviderToUse(): IMetadataProvider {\n return this.Provider ?? Metadata.Provider;\n }\n\n // ── State ───────────────────────────────────────────────────────────\n public IsLoading: boolean = false;\n public IsSaving: boolean = false;\n public SearchTerm: string = '';\n\n public Providers: MJFileStorageProviderEntity[] = [];\n public Accounts: MJFileStorageAccountEntity[] = [];\n public Credentials: MJCredentialEntity[] = [];\n public Roles: MJRoleEntity[] = [];\n public AccountPermissions: MJFileStorageAccountPermissionEntity[] = [];\n\n // ── Account Editor Sub-View / Modal ─────────────────────────────────\n public IsEditingAccount: boolean = false;\n public EditingAccount: MJFileStorageAccountEntity | null = null;\n public EditingAccountName: string = '';\n public EditingAccountDescription: string = '';\n public EditingAccountProviderID: string = '';\n public EditingAccountCredentialID: string = '';\n public EditingAccountIncludeInGlobalSearch: boolean = false;\n public EditingAccountSelectedRoleIDs: string[] = [];\n\n // ── Delete Confirmation ─────────────────────────────────────────────\n public AccountToDelete: MJFileStorageAccountEntity | null = null;\n public IsDeleting: boolean = false;\n\n async ngOnInit(): Promise<void> {\n if (this.Visible) {\n await this.LoadAllData();\n }\n }\n\n public async Open(tab: StorageAdminTab = 'accounts', accountToEdit?: MJFileStorageAccountEntity | null): Promise<void> {\n this.ActiveTab = tab;\n this.Visible = true;\n this.IsEditingAccount = false;\n this.AccountToDelete = null;\n await this.LoadAllData();\n\n if (accountToEdit) {\n this.StartEditAccount(accountToEdit);\n }\n this.cdr.markForCheck();\n }\n\n public async LoadAllData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n\n // Load providers and accounts via FileStorageEngineBase + RunView\n await FileStorageEngineBase.Instance.Config(true);\n this.Providers = [...FileStorageEngineBase.Instance.Providers].sort(\n (a, b) => (a.Priority ?? 0) - (b.Priority ?? 0) || a.Name.localeCompare(b.Name)\n );\n this.Accounts = [...FileStorageEngineBase.Instance.Accounts].sort((a, b) =>\n a.Name.localeCompare(b.Name)\n );\n\n // Load Credentials\n const credResult = await rv.RunView<MJCredentialEntity>({\n EntityName: 'MJ: Credentials',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n if (credResult.Success) {\n this.Credentials = credResult.Results;\n }\n\n // Load Roles\n const roleResult = await rv.RunView<MJRoleEntity>({\n EntityName: 'MJ: Roles',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n if (roleResult.Success) {\n this.Roles = roleResult.Results;\n }\n\n // Load Account Permissions\n const permResult = await rv.RunView<MJFileStorageAccountPermissionEntity>({\n EntityName: 'MJ: File Storage Account Permissions',\n ResultType: 'entity_object',\n });\n if (permResult.Success) {\n this.AccountPermissions = permResult.Results;\n }\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Error loading storage data:', err);\n this.notifications.CreateSimpleNotification('Failed to load storage configuration.', 'error');\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n // ── Computed Rows & Filters ─────────────────────────────────────────\n\n public get FilteredAccountRows(): StorageAccountRow[] {\n const term = (this.SearchTerm || '').toLowerCase().trim();\n // Indexed once per evaluation: this getter re-runs on every change-detection pass.\n const providersByID = IndexByUUID(this.Providers);\n const credentialsByID = IndexByUUID(this.Credentials);\n const roleCounts = CountByUUID(this.AccountPermissions, (p) => p.FileStorageAccountID);\n\n return this.Accounts.filter((a) => {\n if (!term) return true;\n const prov = providersByID.Get(a.ProviderID);\n const cred = credentialsByID.Get(a.CredentialID);\n const credName = cred?.Name || '';\n return (\n a.Name.toLowerCase().includes(term) ||\n (a.Description || '').toLowerCase().includes(term) ||\n (prov?.Name || '').toLowerCase().includes(term) ||\n credName.toLowerCase().includes(term)\n );\n }).map((account) => {\n const provider = providersByID.Get(account.ProviderID);\n const credential = credentialsByID.Get(account.CredentialID);\n const credentialName = credential?.Name;\n const roleCount = roleCounts.Get(account.ID) ?? 0;\n return { account, provider, credentialName, roleCount };\n });\n }\n\n public get ActiveProviders(): MJFileStorageProviderEntity[] {\n return this.Providers.filter((p) => p.IsActive);\n }\n\n // ── Account Editing ─────────────────────────────────────────────────\n\n public StartCreateAccount(): void {\n this.EditingAccount = null;\n this.EditingAccountName = '';\n this.EditingAccountDescription = '';\n this.EditingAccountProviderID = this.ActiveProviders[0]?.ID || (this.Providers[0]?.ID ?? '');\n this.EditingAccountCredentialID = '';\n this.EditingAccountIncludeInGlobalSearch = false;\n this.EditingAccountSelectedRoleIDs = [];\n this.IsEditingAccount = true;\n this.cdr.markForCheck();\n }\n\n public StartEditAccount(account: MJFileStorageAccountEntity): void {\n this.EditingAccount = account;\n this.EditingAccountName = account.Name || '';\n this.EditingAccountDescription = account.Description || '';\n this.EditingAccountProviderID = account.ProviderID || '';\n this.EditingAccountCredentialID = account.CredentialID || '';\n this.EditingAccountIncludeInGlobalSearch = !!account.IncludeInGlobalSearch;\n\n const accountPerms = this.AccountPermissions.filter((p) => UUIDsEqual(p.FileStorageAccountID, account.ID));\n this.EditingAccountSelectedRoleIDs = accountPerms\n .map((p) => p.RoleID)\n .filter((roleId): roleId is string => roleId !== null && roleId !== undefined);\n\n this.IsEditingAccount = true;\n this.cdr.markForCheck();\n }\n\n public CancelEditAccount(): void {\n this.IsEditingAccount = false;\n this.EditingAccount = null;\n this.cdr.markForCheck();\n }\n\n public ToggleRoleSelection(roleId: string): void {\n const idx = this.EditingAccountSelectedRoleIDs.findIndex((id) => UUIDsEqual(id, roleId));\n if (idx >= 0) {\n this.EditingAccountSelectedRoleIDs.splice(idx, 1);\n } else {\n this.EditingAccountSelectedRoleIDs.push(roleId);\n }\n }\n\n public IsRoleSelected(roleId: string): boolean {\n return this.EditingAccountSelectedRoleIDs.some((id) => UUIDsEqual(id, roleId));\n }\n\n public async OpenCreateCredentialDialog(): Promise<void> {\n try {\n const result = await this.credentialDialog.openDialog(this.viewContainerRef, {\n title: 'Create Credential for Storage Account',\n });\n if (result.success && result.credential) {\n // Refresh credentials list\n const md = this.ProviderToUse;\n const rv = RunView.FromMetadataProvider(md);\n const credResult = await rv.RunView<MJCredentialEntity>({\n EntityName: 'MJ: Credentials',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n if (credResult.Success) {\n this.Credentials = credResult.Results;\n }\n this.EditingAccountCredentialID = result.credential.ID;\n this.notifications.CreateSimpleNotification(`Credential \"${result.credential.Name}\" created.`, 'success');\n this.cdr.markForCheck();\n }\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Error creating credential:', err);\n }\n }\n\n public async SaveAccount(): Promise<void> {\n const name = this.EditingAccountName.trim();\n if (!name) {\n this.notifications.CreateSimpleNotification('Account name is required.', 'warning');\n return;\n }\n if (!this.EditingAccountProviderID) {\n this.notifications.CreateSimpleNotification('Storage provider is required.', 'warning');\n return;\n }\n\n this.IsSaving = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const user = md.CurrentUser;\n let accountEntity: MJFileStorageAccountEntity;\n\n if (this.EditingAccount) {\n accountEntity = this.EditingAccount;\n } else {\n accountEntity = await md.GetEntityObject<MJFileStorageAccountEntity>(\n 'MJ: File Storage Accounts',\n user\n );\n }\n\n accountEntity.Name = name;\n accountEntity.Description = this.EditingAccountDescription.trim() || null;\n accountEntity.ProviderID = this.EditingAccountProviderID;\n accountEntity.CredentialID = this.EditingAccountCredentialID || '';\n accountEntity.IncludeInGlobalSearch = this.EditingAccountIncludeInGlobalSearch;\n\n const saved = await accountEntity.Save();\n if (!saved) {\n throw new Error(accountEntity.LatestResult?.Message || 'Failed to save storage account.');\n }\n\n // Sync Role Permissions\n await this.syncAccountPermissions(accountEntity.ID, this.EditingAccountSelectedRoleIDs);\n\n // Force engine refresh\n await FileStorageEngineBase.Instance.Config(true);\n await this.LoadAllData();\n\n this.IsEditingAccount = false;\n this.EditingAccount = null;\n this.AccountsChanged.emit();\n this.notifications.CreateSimpleNotification(`Storage account \"${name}\" saved successfully.`, 'success');\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Error saving account:', err);\n const msg = err instanceof Error ? err.message : 'Failed to save storage account.';\n this.notifications.CreateSimpleNotification(msg, 'error');\n } finally {\n this.IsSaving = false;\n this.cdr.markForCheck();\n }\n }\n\n private async syncAccountPermissions(accountId: string, desiredRoleIds: string[]): Promise<void> {\n const md = this.ProviderToUse;\n const user = md.CurrentUser;\n\n const existingPerms = this.AccountPermissions.filter((p) => UUIDsEqual(p.FileStorageAccountID, accountId));\n const existingRoleMap = new Map<string, MJFileStorageAccountPermissionEntity>();\n for (const p of existingPerms) {\n if (p.RoleID) {\n existingRoleMap.set(p.RoleID, p);\n }\n }\n\n // Delete permissions for unselected roles\n for (const p of existingPerms) {\n if (!p.RoleID || !desiredRoleIds.some((rId) => UUIDsEqual(rId, p.RoleID))) {\n await p.Delete();\n }\n }\n\n // Add permissions for newly selected roles\n for (const roleId of desiredRoleIds) {\n if (!existingRoleMap.has(roleId)) {\n const newPerm = await md.GetEntityObject<MJFileStorageAccountPermissionEntity>(\n 'MJ: File Storage Account Permissions',\n user\n );\n newPerm.FileStorageAccountID = accountId;\n newPerm.Type = 'Role';\n newPerm.RoleID = roleId;\n newPerm.CanRead = true;\n newPerm.CanWrite = true;\n await newPerm.Save();\n }\n }\n }\n\n // ── Account Deletion ────────────────────────────────────────────────\n\n public ConfirmDeleteAccount(account: MJFileStorageAccountEntity): void {\n this.AccountToDelete = account;\n this.cdr.markForCheck();\n }\n\n public CancelDeleteAccount(): void {\n this.AccountToDelete = null;\n this.cdr.markForCheck();\n }\n\n public async ExecuteDeleteAccount(): Promise<void> {\n if (!this.AccountToDelete) return;\n this.IsDeleting = true;\n this.cdr.markForCheck();\n\n try {\n const accountName = this.AccountToDelete.Name;\n const accountId = this.AccountToDelete.ID;\n\n // Delete associated permissions first\n const perms = this.AccountPermissions.filter((p) => UUIDsEqual(p.FileStorageAccountID, accountId));\n for (const p of perms) {\n await p.Delete();\n }\n\n const deleted = await this.AccountToDelete.Delete();\n if (!deleted) {\n throw new Error('Failed to delete storage account.');\n }\n\n await FileStorageEngineBase.Instance.Config(true);\n await this.LoadAllData();\n\n this.AccountToDelete = null;\n this.AccountsChanged.emit();\n this.notifications.CreateSimpleNotification(`Storage account \"${accountName}\" removed.`, 'info');\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Delete error:', err);\n const msg = err instanceof Error ? err.message : 'Failed to delete storage account.';\n this.notifications.CreateSimpleNotification(msg, 'error');\n } finally {\n this.IsDeleting = false;\n this.cdr.markForCheck();\n }\n }\n\n // ── Provider Management ─────────────────────────────────────────────\n\n public async ToggleProviderActive(provider: MJFileStorageProviderEntity): Promise<void> {\n const newState = !provider.IsActive;\n provider.IsActive = newState;\n this.cdr.markForCheck();\n\n try {\n const saved = await provider.Save();\n if (!saved) {\n provider.IsActive = !newState; // rollback\n throw new Error(provider.LatestResult?.Message || 'Failed to update provider status.');\n }\n await FileStorageEngineBase.Instance.Config(true);\n this.AccountsChanged.emit();\n this.notifications.CreateSimpleNotification(\n `Provider \"${provider.Name}\" is now ${newState ? 'active' : 'inactive'}.`,\n 'info'\n );\n } catch (err) {\n console.error('[StorageAdminDialogComponent] Provider toggle error:', err);\n this.notifications.CreateSimpleNotification('Failed to update provider status.', 'error');\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n // ── UI Helpers ──────────────────────────────────────────────────────\n\n public GetProviderIcon(providerName: string): string {\n const name = (providerName || '').toLowerCase();\n if (name.includes('aws') || name.includes('s3')) return 'fa-brands fa-aws';\n if (name.includes('azure')) return 'fa-brands fa-microsoft';\n if (name.includes('google drive')) return 'fa-brands fa-google-drive';\n if (name.includes('google cloud')) return 'fa-brands fa-google';\n if (name.includes('dropbox')) return 'fa-brands fa-dropbox';\n if (name.includes('box')) return 'fa-solid fa-box';\n if (name.includes('sharepoint') || name.includes('onedrive')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-cloud';\n }\n\n public OnDialogClose(): void {\n this.Visible = false;\n this.IsEditingAccount = false;\n this.AccountToDelete = null;\n this.Close.emit();\n }\n}\n","<mj-dialog\n [Visible]=\"Visible\"\n Title=\"Manage File Storage\"\n [Width]=\"880\"\n [MinWidth]=\"600\"\n (Close)=\"OnDialogClose()\">\n\n <div class=\"mj-storage-admin-container\">\n <!-- Tab Navigation -->\n <div class=\"mj-storage-admin-tabs\">\n <button\n type=\"button\"\n class=\"mj-tab-btn\"\n [class.active]=\"ActiveTab === 'accounts'\"\n (click)=\"ActiveTab = 'accounts'\">\n <i class=\"fa-solid fa-server\"></i>\n <span>Storage Accounts</span>\n <span class=\"mj-tab-count\">{{ Accounts.length }}</span>\n </button>\n\n <button\n type=\"button\"\n class=\"mj-tab-btn\"\n [class.active]=\"ActiveTab === 'providers'\"\n (click)=\"ActiveTab = 'providers'\">\n <i class=\"fa-solid fa-cubes\"></i>\n <span>Storage Providers</span>\n <span class=\"mj-tab-count\">{{ Providers.length }}</span>\n </button>\n </div>\n\n <!-- ── TAB 1: STORAGE ACCOUNTS ────────────────────────────────────── -->\n @if (ActiveTab === 'accounts') {\n <div class=\"mj-tab-pane\">\n <!-- Toolbar -->\n <div class=\"mj-admin-pane-toolbar\">\n <div class=\"mj-admin-search-wrapper\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input\n type=\"text\"\n [(ngModel)]=\"SearchTerm\"\n placeholder=\"Search storage accounts by name, provider, or credential...\" />\n @if (SearchTerm) {\n <button type=\"button\" class=\"mj-clear-btn\" (click)=\"SearchTerm = ''\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-primary\"\n (click)=\"StartCreateAccount()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Add Storage Account</span>\n </button>\n </div>\n\n <!-- Loading -->\n @if (IsLoading) {\n <div class=\"mj-admin-loading\">\n <mj-loading text=\"Loading storage accounts...\"></mj-loading>\n </div>\n } @else if (FilteredAccountRows.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-folder-plus\"\n [Title]=\"SearchTerm ? 'No matching storage accounts' : 'No storage accounts configured'\"\n [Message]=\"SearchTerm ? 'Try adjusting your search query.' : 'Configure storage accounts to connect MemberJunction to cloud storage services like AWS S3, Azure Blob Storage, Box, Dropbox, or Google Drive.'\">\n @if (!SearchTerm) {\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-primary mj-empty-cta\"\n (click)=\"StartCreateAccount()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>Configure First Account</span>\n </button>\n }\n </mj-empty-state>\n } @else {\n <!-- Accounts List -->\n <div class=\"mj-admin-table-container\">\n <table class=\"mj-admin-table\">\n <thead>\n <tr>\n <th>Account Name</th>\n <th>Provider</th>\n <th>Credential</th>\n <th>Global Search</th>\n <th>Role Access</th>\n <th class=\"mj-text-right\">Actions</th>\n </tr>\n </thead>\n <tbody>\n @for (row of FilteredAccountRows; track row.account.ID) {\n <tr>\n <td>\n <div class=\"mj-account-name-cell\">\n <span class=\"mj-account-title\">{{ row.account.Name }}</span>\n @if (row.account.Description) {\n <span class=\"mj-account-desc\">{{ row.account.Description }}</span>\n }\n </div>\n </td>\n <td>\n <span class=\"mj-provider-badge\">\n <i [class]=\"GetProviderIcon(row.provider?.Name || row.account.Provider)\"></i>\n <span>{{ row.provider?.Name || row.account.Provider }}</span>\n </span>\n </td>\n <td>\n @if (row.credentialName) {\n <span class=\"mj-status-badge mj-status-badge--success\" [title]=\"'Credential: ' + row.credentialName\">\n <i class=\"fa-solid fa-key\"></i>\n <span>{{ row.credentialName }}</span>\n </span>\n } @else {\n <span class=\"mj-status-badge mj-status-badge--warning\" title=\"No credential configured\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>No Credential</span>\n </span>\n }\n </td>\n <td>\n @if (row.account.IncludeInGlobalSearch) {\n <span class=\"mj-status-badge mj-status-badge--info\">\n <i class=\"fa-solid fa-check\"></i>\n <span>Enabled</span>\n </span>\n } @else {\n <span class=\"mj-status-badge mj-status-badge--muted\">\n <span>Disabled</span>\n </span>\n }\n </td>\n <td>\n <span class=\"mj-role-count-badge\">\n <i class=\"fa-solid fa-user-shield\"></i>\n <span>{{ row.roleCount === 0 ? 'All Users' : row.roleCount + ' Role(s)' }}</span>\n </span>\n </td>\n <td class=\"mj-text-right\">\n <div class=\"mj-action-button-group\">\n <button\n type=\"button\"\n class=\"mj-action-icon-btn\"\n title=\"Edit Account\"\n (click)=\"StartEditAccount(row.account)\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n </button>\n <button\n type=\"button\"\n class=\"mj-action-icon-btn mj-action-icon-btn--danger\"\n title=\"Delete Account\"\n (click)=\"ConfirmDeleteAccount(row.account)\">\n <i class=\"fa-solid fa-trash-can\"></i>\n </button>\n </div>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n }\n\n <!-- ── TAB 2: STORAGE PROVIDERS ────────────────────────────────────── -->\n @if (ActiveTab === 'providers') {\n <div class=\"mj-tab-pane\">\n <div class=\"mj-admin-pane-desc\">\n <i class=\"fa-solid fa-circle-info\"></i>\n <span>Enable or disable storage provider integrations for your organization. Only active providers are available when configuring accounts.</span>\n </div>\n\n <div class=\"mj-admin-table-container\">\n <table class=\"mj-admin-table\">\n <thead>\n <tr>\n <th>Status</th>\n <th>Provider Driver</th>\n <th>Server Driver Key</th>\n <th>Client Driver Key</th>\n <th>Search Support</th>\n <th class=\"mj-text-center\">Priority</th>\n </tr>\n </thead>\n <tbody>\n @for (prov of Providers; track prov.ID) {\n <tr [class.mj-row-inactive]=\"!prov.IsActive\">\n <td>\n <label class=\"mj-toggle-switch\" [title]=\"prov.IsActive ? 'Deactivate provider' : 'Activate provider'\">\n <input\n type=\"checkbox\"\n [checked]=\"prov.IsActive\"\n (change)=\"ToggleProviderActive(prov)\" />\n <span class=\"mj-toggle-slider\"></span>\n </label>\n </td>\n <td>\n <div class=\"mj-provider-cell\">\n <div class=\"mj-provider-icon-circle\">\n <i [class]=\"GetProviderIcon(prov.Name)\"></i>\n </div>\n <div>\n <div class=\"mj-provider-name\">{{ prov.Name }}</div>\n @if (prov.Description) {\n <div class=\"mj-provider-desc\">{{ prov.Description }}</div>\n }\n </div>\n </div>\n </td>\n <td>\n <code class=\"mj-code-pill\">{{ prov.ServerDriverKey || '—' }}</code>\n </td>\n <td>\n <code class=\"mj-code-pill\">{{ prov.ClientDriverKey || '—' }}</code>\n </td>\n <td>\n @if (prov.SupportsSearch) {\n <span class=\"mj-status-badge mj-status-badge--success\" title=\"Provider supports full-text file search\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <span>Native Search</span>\n </span>\n } @else {\n <span class=\"mj-status-badge mj-status-badge--muted\">\n <span>Standard</span>\n </span>\n }\n </td>\n <td class=\"mj-text-center\">\n <span class=\"mj-priority-pill\">{{ prov.Priority }}</span>\n </td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n </div>\n\n <mj-dialog-actions>\n <button type=\"button\" class=\"mj-admin-btn mj-admin-btn-secondary\" (click)=\"OnDialogClose()\">\n Close\n </button>\n </mj-dialog-actions>\n</mj-dialog>\n\n<!-- ── ACCOUNT CREATE / EDIT SUB-DIALOG ──────────────────────────────── -->\n@if (IsEditingAccount) {\n <mj-dialog\n [Visible]=\"IsEditingAccount\"\n [Title]=\"EditingAccount ? 'Edit Storage Account: ' + EditingAccount.Name : 'Add Storage Account'\"\n [Width]=\"640\"\n (Close)=\"CancelEditAccount()\">\n\n <div class=\"mj-account-editor-form\">\n <!-- Provider Selection -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Storage Provider <span class=\"mj-required\">*</span></label>\n <select\n class=\"mj-form-select\"\n [(ngModel)]=\"EditingAccountProviderID\"\n [disabled]=\"!!EditingAccount\">\n @for (prov of ActiveProviders; track prov.ID) {\n <option [value]=\"prov.ID\">{{ prov.Name }}</option>\n }\n </select>\n <div class=\"mj-form-hint\">Select the cloud storage engine driver for this account.</div>\n </div>\n\n <!-- Account Name -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Account Name <span class=\"mj-required\">*</span></label>\n <input\n type=\"text\"\n class=\"mj-form-input\"\n [(ngModel)]=\"EditingAccountName\"\n placeholder=\"e.g., Corporate Azure Blob Storage, Marketing S3 Bucket\" />\n </div>\n\n <!-- Account Description -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Description</label>\n <textarea\n class=\"mj-form-textarea\"\n rows=\"2\"\n [(ngModel)]=\"EditingAccountDescription\"\n placeholder=\"Optional notes or details about the intended purpose of this storage account...\"></textarea>\n </div>\n\n <!-- Credential Picker with Inline Create -->\n <div class=\"mj-form-group\">\n <div class=\"mj-form-label-row\">\n <label class=\"mj-form-label\">Storage Credentials</label>\n <button\n type=\"button\"\n class=\"mj-admin-btn-link\"\n (click)=\"OpenCreateCredentialDialog()\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New Credential</span>\n </button>\n </div>\n <div class=\"mj-credential-input-row\">\n <select class=\"mj-form-select\" [(ngModel)]=\"EditingAccountCredentialID\">\n <option value=\"\">-- No Credential Assigned --</option>\n @for (cred of Credentials; track cred.ID) {\n <option [value]=\"cred.ID\">{{ cred.Name }}</option>\n }\n </select>\n </div>\n <div class=\"mj-form-hint\">\n Credentials manage authentication tokens, connection strings, or API keys securely via the Credential Engine.\n </div>\n </div>\n\n <!-- Global Search Toggle -->\n <div class=\"mj-form-checkbox-group\">\n <label class=\"mj-checkbox-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"EditingAccountIncludeInGlobalSearch\" />\n <span>Include in Global Search</span>\n </label>\n <div class=\"mj-form-hint mj-checkbox-hint\">\n When enabled, file contents and metadata in this account will be indexed for universal MemberJunction search.\n </div>\n </div>\n\n <!-- Role Permissions -->\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Role Access Permissions</label>\n <div class=\"mj-form-hint\">\n Select specific roles permitted to access this storage account. If no roles are selected, all authorized users have access.\n </div>\n <div class=\"mj-roles-checklist\">\n @for (role of Roles; track role.ID) {\n <label class=\"mj-role-check-item\">\n <input\n type=\"checkbox\"\n [checked]=\"IsRoleSelected(role.ID)\"\n (change)=\"ToggleRoleSelection(role.ID)\" />\n <span>{{ role.Name }}</span>\n </label>\n }\n </div>\n </div>\n </div>\n\n <mj-dialog-actions>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-secondary\"\n [disabled]=\"IsSaving\"\n (click)=\"CancelEditAccount()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-primary\"\n [disabled]=\"IsSaving || !EditingAccountName.trim() || !EditingAccountProviderID\"\n (click)=\"SaveAccount()\">\n @if (IsSaving) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Saving...</span>\n } @else {\n <i class=\"fa-solid fa-check\"></i>\n <span>{{ EditingAccount ? 'Save Changes' : 'Create Account' }}</span>\n }\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n\n<!-- ── DELETE CONFIRMATION DIALOG ────────────────────────────────────── -->\n@if (AccountToDelete) {\n <mj-dialog\n [Visible]=\"!!AccountToDelete\"\n Title=\"Delete Storage Account\"\n [Width]=\"460\"\n (Close)=\"CancelDeleteAccount()\">\n\n <div class=\"mj-delete-confirm-body\">\n <div class=\"mj-delete-confirm-icon\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </div>\n <div class=\"mj-delete-confirm-text\">\n <p class=\"mj-delete-confirm-title\">\n Are you sure you want to delete <strong>{{ AccountToDelete.Name }}</strong>?\n </p>\n <p class=\"mj-delete-confirm-subtitle\">\n This will remove the storage account connection and role permissions. Existing files in the remote storage service will not be deleted, but will no longer be accessible via this account in MemberJunction.\n </p>\n </div>\n </div>\n\n <mj-dialog-actions>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-secondary\"\n [disabled]=\"IsDeleting\"\n (click)=\"CancelDeleteAccount()\">\n Cancel\n </button>\n <button\n type=\"button\"\n class=\"mj-admin-btn mj-admin-btn-danger\"\n [disabled]=\"IsDeleting\"\n (click)=\"ExecuteDeleteAccount()\">\n @if (IsDeleting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Deleting...</span>\n } @else {\n <i class=\"fa-solid fa-trash-can\"></i>\n <span>Delete Account</span>\n }\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n"]}
|
|
@@ -101,6 +101,8 @@ export declare class FilesGridComponent extends BaseAngularComponent implements
|
|
|
101
101
|
private buildColumnDefs;
|
|
102
102
|
/**
|
|
103
103
|
* Creates a small action button element for the AG Grid cell renderer.
|
|
104
|
+
* Built imperatively, so this component's emulated-encapsulation stylesheet
|
|
105
|
+
* cannot reach it; the canonical mjButton classes are its only styling.
|
|
104
106
|
*/
|
|
105
107
|
private createActionButton;
|
|
106
108
|
static ɵfac: i0.ɵɵFactoryDeclaration<FilesGridComponent, never>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files-grid.d.ts","sourceRoot":"","sources":["../../../src/lib/files-grid/files-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D,OAAO,EACL,MAAM,EACN,cAAc,EAKd,KAAK,KAAK,EAEX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;;AAmD7D,qBAMa,kBAAmB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAmC3E,OAAO,CAAC,aAAa;IAlC1B,KAAK,EAAE,YAAY,EAAE,CAAM;IAElC,qCAAqC;IACrC,IAAW,KAAK,IAAI,YAAY,EAAE,CAEjC;IACD,qCAAqC;IACrC,IAAW,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,EAErC;IACM,SAAS,EAAE,OAAO,CAAS;IAC3B,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IAE1C,wCAAwC;IACxC,IAAW,QAAQ,IAAI,YAAY,GAAG,SAAS,CAE9C;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,EAElD;IAKM,SAAS,EAAE,KAAK,CAAmD;IACnE,UAAU,EAAE,MAAM,EAAE,CAAM;IAC1B,aAAa,EAAE,MAAM,CAI1B;IACF,OAAO,CAAC,OAAO,CAAwB;gBAEnB,aAAa,EAAE,qBAAqB;IAK/C,UAAU,EAAE,MAAM,GAAG,SAAS,CAAa;IAEpD,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMlC,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAI/C;;;;;;OAMG;IACI,aAAa;IAKpB,6CAA6C;IACtC,aAAa;IAIpB;;;;;;;OAOG;IACU,YAAY;IAmBzB,4CAA4C;IAC/B,YAAY;IAIzB;;;;;;OAMG;IACI,YAAY,GAAU,MAAM,YAAY,mBAkB7C;IAEF,4CAA4C;IAC5C,IAAW,YAAY,WArBY,YAAY,mBAuB9C;IACD,4CAA4C;IAC5C,IAAW,YAAY,CAAC,KAAK,SAzBM,YAAY,kBAyBlB,EAE5B;IAED;;;;;OAKG;IACI,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAMhD,4CAA4C;IACrC,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAIhD;;;;;;OAMG;IACI,UAAU,GAAU,MAAM,YAAY,mBAY3C;IAEF,0CAA0C;IAC1C,IAAW,UAAU,WAfY,YAAY,mBAiB5C;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAK,SAnBM,YAAY,kBAmBlB,EAE1B;IAED;;;;;OAKG;IACI,gBAAgB,CAAC,CAAC,EAAE,eAAe;IAW1C,gDAAgD;IACzC,gBAAgB,CAAC,CAAC,EAAE,eAAe;IAI1C;;;OAGG;IACG,OAAO;IAiBb;;OAEG;IACH,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"files-grid.d.ts","sourceRoot":"","sources":["../../../src/lib/files-grid/files-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAG7D,OAAO,EACL,MAAM,EACN,cAAc,EAKd,KAAK,KAAK,EAEX,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;;AAmD7D,qBAMa,kBAAmB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAmC3E,OAAO,CAAC,aAAa;IAlC1B,KAAK,EAAE,YAAY,EAAE,CAAM;IAElC,qCAAqC;IACrC,IAAW,KAAK,IAAI,YAAY,EAAE,CAEjC;IACD,qCAAqC;IACrC,IAAW,KAAK,CAAC,KAAK,EAAE,YAAY,EAAE,EAErC;IACM,SAAS,EAAE,OAAO,CAAS;IAC3B,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IAE1C,wCAAwC;IACxC,IAAW,QAAQ,IAAI,YAAY,GAAG,SAAS,CAE9C;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,EAElD;IAKM,SAAS,EAAE,KAAK,CAAmD;IACnE,UAAU,EAAE,MAAM,EAAE,CAAM;IAC1B,aAAa,EAAE,MAAM,CAI1B;IACF,OAAO,CAAC,OAAO,CAAwB;gBAEnB,aAAa,EAAE,qBAAqB;IAK/C,UAAU,EAAE,MAAM,GAAG,SAAS,CAAa;IAEpD,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMlC,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAI/C;;;;;;OAMG;IACI,aAAa;IAKpB,6CAA6C;IACtC,aAAa;IAIpB;;;;;;;OAOG;IACU,YAAY;IAmBzB,4CAA4C;IAC/B,YAAY;IAIzB;;;;;;OAMG;IACI,YAAY,GAAU,MAAM,YAAY,mBAkB7C;IAEF,4CAA4C;IAC5C,IAAW,YAAY,WArBY,YAAY,mBAuB9C;IACD,4CAA4C;IAC5C,IAAW,YAAY,CAAC,KAAK,SAzBM,YAAY,kBAyBlB,EAE5B;IAED;;;;;OAKG;IACI,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAMhD,4CAA4C;IACrC,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO;IAIhD;;;;;;OAMG;IACI,UAAU,GAAU,MAAM,YAAY,mBAY3C;IAEF,0CAA0C;IAC1C,IAAW,UAAU,WAfY,YAAY,mBAiB5C;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAK,SAnBM,YAAY,kBAmBlB,EAE1B;IAED;;;;;OAKG;IACI,gBAAgB,CAAC,CAAC,EAAE,eAAe;IAW1C,gDAAgD;IACzC,gBAAgB,CAAC,CAAC,EAAE,eAAe;IAI1C;;;OAGG;IACG,OAAO;IAiBb;;OAEG;IACH,OAAO,CAAC,eAAe;IAkCvB;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;yCAjRf,kBAAkB;2CAAlB,kBAAkB;CA0R9B"}
|
|
@@ -312,7 +312,6 @@ export class FilesGridComponent extends BaseAngularComponent {
|
|
|
312
312
|
filter: false,
|
|
313
313
|
cellRenderer: (params) => {
|
|
314
314
|
const container = document.createElement('div');
|
|
315
|
-
container.className = 'action-buttons';
|
|
316
315
|
const downloadBtn = this.createActionButton('fa-download', params.data?.Status !== 'Uploaded');
|
|
317
316
|
downloadBtn.addEventListener('click', () => this.DownloadFile(params.data));
|
|
318
317
|
const deleteBtn = this.createActionButton('fa-trash-can', !this.CanBeDeleted(params.data));
|
|
@@ -329,10 +328,12 @@ export class FilesGridComponent extends BaseAngularComponent {
|
|
|
329
328
|
}
|
|
330
329
|
/**
|
|
331
330
|
* Creates a small action button element for the AG Grid cell renderer.
|
|
331
|
+
* Built imperatively, so this component's emulated-encapsulation stylesheet
|
|
332
|
+
* cannot reach it; the canonical mjButton classes are its only styling.
|
|
332
333
|
*/
|
|
333
334
|
createActionButton(iconClass, disabled) {
|
|
334
335
|
const btn = document.createElement('button');
|
|
335
|
-
btn.className = 'mj-btn mj-btn
|
|
336
|
+
btn.className = 'mj-btn mj-btn--flat mj-btn--sm';
|
|
336
337
|
btn.disabled = disabled;
|
|
337
338
|
const icon = document.createElement('span');
|
|
338
339
|
icon.className = `fa-solid ${iconClass}`;
|
|
@@ -375,11 +376,11 @@ export class FilesGridComponent extends BaseAngularComponent {
|
|
|
375
376
|
i0.ɵɵproperty("disabled", ctx.isLoading || !(ctx.editFile == null ? null : ctx.editFile.Dirty));
|
|
376
377
|
i0.ɵɵadvance(2);
|
|
377
378
|
i0.ɵɵproperty("disabled", ctx.isLoading);
|
|
378
|
-
} }, dependencies: [i2.ɵNgNoValidate, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgControlStatusGroup, i2.RequiredValidator, i2.NgModel, i2.NgForm, i3.AgGridAngular, i4.LoadingComponent, i5.MJButtonDirective, i5.MJDialogComponent, i5.MJDialogActionsComponent, i6.FileUploadComponent], styles: [".container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.files-grid[_ngcontent-%COMP%] {\n width: 100%;\n height: 400px;\n}\n\n.grid-loading-overlay[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 16px;\n}\n\n.edit-form-container[_ngcontent-%COMP%] {\n padding: 8px 0;\n}\n\n.mj-form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 12px;\n margin-bottom: 8px;\n}\n\n.mj-form-label[_ngcontent-%COMP%] {\n min-width: 80px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.mj-form-field[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n width: 100%;\n}
|
|
379
|
+
} }, dependencies: [i2.ɵNgNoValidate, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgControlStatusGroup, i2.RequiredValidator, i2.NgModel, i2.NgForm, i3.AgGridAngular, i4.LoadingComponent, i5.MJButtonDirective, i5.MJDialogComponent, i5.MJDialogActionsComponent, i6.FileUploadComponent], styles: [".container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.files-grid[_ngcontent-%COMP%] {\n width: 100%;\n height: 400px;\n}\n\n.grid-loading-overlay[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 16px;\n}\n\n.edit-form-container[_ngcontent-%COMP%] {\n padding: 8px 0;\n}\n\n.mj-form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 12px;\n margin-bottom: 8px;\n}\n\n.mj-form-label[_ngcontent-%COMP%] {\n min-width: 80px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.mj-form-field[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n width: 100%;\n}"] });
|
|
379
380
|
}
|
|
380
381
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FilesGridComponent, [{
|
|
381
382
|
type: Component,
|
|
382
|
-
args: [{ standalone: false, selector: 'mj-files-grid', template: "<div class=\"container\">\n @if (isLoading) {\n <div class=\"grid-loading-overlay\">\n <mj-loading text=\"Loading files...\" size=\"medium\"></mj-loading>\n </div>\n }\n <ag-grid-angular\n class=\"files-grid\"\n [theme]=\"GridTheme\"\n [rowData]=\"files\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [loading]=\"isLoading\"\n (gridReady)=\"OnGridReady($event)\">\n </ag-grid-angular>\n\n <mj-files-file-upload\n [CategoryID]=\"CategoryID\"\n [disabled]=\"isLoading\"\n (uploadStarted)=\"isLoading = true\"\n (fileUpload)=\"handleFileUpload($event)\"\n ></mj-files-file-upload>\n\n <mj-dialog\n [Visible]=\"!!editFile\"\n Title=\"Edit file\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"resetEditFile()\">\n @if (editFile) {\n <div class=\"edit-form-container\">\n <form #templateForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"name\"\n [(ngModel)]=\"editFile.Name\"\n required\n [disabled]=\"isLoading\" />\n </label>\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Description</span>\n <input\n class=\"mj-input\"\n name=\"description\"\n [(ngModel)]=\"editFile.Description\"\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n }\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveEditFile()\" [disabled]=\"isLoading || !editFile?.Dirty\">Save</button>\n <button mjButton (click)=\"resetEditFile()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n</div>\n", styles: [".container {\n display: flex;\n flex-direction: column;\n}\n\n.files-grid {\n width: 100%;\n height: 400px;\n}\n\n.grid-loading-overlay {\n display: flex;\n justify-content: center;\n padding: 16px;\n}\n\n.edit-form-container {\n padding: 8px 0;\n}\n\n.mj-form-field {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 12px;\n margin-bottom: 8px;\n}\n\n.mj-form-label {\n min-width: 80px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.mj-form-field .mj-input {\n width: 100%;\n}\n
|
|
383
|
+
args: [{ standalone: false, selector: 'mj-files-grid', template: "<div class=\"container\">\n @if (isLoading) {\n <div class=\"grid-loading-overlay\">\n <mj-loading text=\"Loading files...\" size=\"medium\"></mj-loading>\n </div>\n }\n <ag-grid-angular\n class=\"files-grid\"\n [theme]=\"GridTheme\"\n [rowData]=\"files\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [loading]=\"isLoading\"\n (gridReady)=\"OnGridReady($event)\">\n </ag-grid-angular>\n\n <mj-files-file-upload\n [CategoryID]=\"CategoryID\"\n [disabled]=\"isLoading\"\n (uploadStarted)=\"isLoading = true\"\n (fileUpload)=\"handleFileUpload($event)\"\n ></mj-files-file-upload>\n\n <mj-dialog\n [Visible]=\"!!editFile\"\n Title=\"Edit file\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"resetEditFile()\">\n @if (editFile) {\n <div class=\"edit-form-container\">\n <form #templateForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"name\"\n [(ngModel)]=\"editFile.Name\"\n required\n [disabled]=\"isLoading\" />\n </label>\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Description</span>\n <input\n class=\"mj-input\"\n name=\"description\"\n [(ngModel)]=\"editFile.Description\"\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n }\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveEditFile()\" [disabled]=\"isLoading || !editFile?.Dirty\">Save</button>\n <button mjButton (click)=\"resetEditFile()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n</div>\n", styles: [".container {\n display: flex;\n flex-direction: column;\n}\n\n.files-grid {\n width: 100%;\n height: 400px;\n}\n\n.grid-loading-overlay {\n display: flex;\n justify-content: center;\n padding: 16px;\n}\n\n.edit-form-container {\n padding: 8px 0;\n}\n\n.mj-form-field {\n display: flex;\n flex-direction: row;\n align-items: center;\n column-gap: 12px;\n margin-bottom: 8px;\n}\n\n.mj-form-label {\n min-width: 80px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.mj-form-field .mj-input {\n width: 100%;\n}\n"] }]
|
|
383
384
|
}], () => [{ type: i1.MJNotificationService }], { CategoryID: [{
|
|
384
385
|
type: Input
|
|
385
386
|
}] }); })();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files-grid.js","sourceRoot":"","sources":["../../../src/lib/files-grid/files-grid.ts","../../../src/lib/files-grid/files-grid.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\nimport { RunView } from '@memberjunction/core';\nimport { MJFileEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, gql } from '@memberjunction/graphql-dataprovider';\nimport { MJ_AG_GRID_THEME_PARAMS } from '@memberjunction/ng-shared-generic';\nimport {\n ColDef,\n GridReadyEvent,\n GridApi,\n ModuleRegistry,\n AllCommunityModule,\n themeAlpine,\n type Theme,\n ICellRendererParams\n} from 'ag-grid-community';\nimport { z } from 'zod';\nimport { FileUploadEvent } from '../file-upload/file-upload';\n\n// Register AG Grid modules\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/**\n * Downloads a file from the provided URL.\n *\n * @param url - The URL of the file to be downloaded.\n * @param fileName - The name to be given to the downloaded file.\n * @param contentType - The content type of the file. Defaults to 'application/octet-stream'.\n * @returns Promise<void> - A promise that resolves when the file download is complete.\n */\nconst downloadFromUrl = async (url: string, fileName: string, contentType?: string | null) => {\n // First, fetch the data and create a blob with the correct content type\n const response = await fetch(url);\n if (!response.ok) {\n return false;\n }\n const rawBlob = await response.blob();\n const blob = new Blob([rawBlob], { type: contentType || 'application/octet-stream' });\n\n // Then add a temporary link to the document and click it\n const link = document.createElement('a');\n const blobUrl = window.URL.createObjectURL(blob);\n link.href = blobUrl;\n link.setAttribute('download', fileName);\n document.body.appendChild(link);\n link.click();\n link.parentNode?.removeChild(link);\n window.URL.revokeObjectURL(blobUrl);\n\n return true;\n};\n\nconst FileDownloadQuery = gql`\n query FileDownloadUrl($FileID: String!) {\n MJFile(ID: $FileID) {\n ContentType\n DownloadUrl\n }\n }\n`;\n\nconst FileDownloadQuerySchema = z.object({\n MJFile: z.object({\n ContentType: z.string().optional(),\n DownloadUrl: z.string(),\n }),\n});\n\n@Component({\n standalone: false,\n selector: 'mj-files-grid',\n templateUrl: './files-grid.html',\n styleUrls: ['./files-grid.css'],\n})\nexport class FilesGridComponent extends BaseAngularComponent implements OnInit, OnChanges {\n public Files: MJFileEntity[] = [];\n\n /** @deprecated Use {@link Files}. */\n public get files(): MJFileEntity[] {\n return this.Files;\n }\n /** @deprecated Use {@link Files}. */\n public set files(value: MJFileEntity[]) {\n this.Files = value;\n }\n public isLoading: boolean = false;\n public EditFile: MJFileEntity | undefined;\n\n /** @deprecated Use {@link EditFile}. */\n public get editFile(): MJFileEntity | undefined {\n return this.EditFile;\n }\n /** @deprecated Use {@link EditFile}. */\n public set editFile(value: MJFileEntity | undefined) {\n this.EditFile = value;\n }\n\n // AG Grid configuration\n // Themed from the shared --mj-* token params so this grid follows light/dark and\n // the org brand overlay, matching the main entity/query grids.\n public GridTheme: Theme = themeAlpine.withParams(MJ_AG_GRID_THEME_PARAMS);\n public ColumnDefs: ColDef[] = [];\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n filter: false,\n };\n private gridApi: GridApi | null = null;\n\n constructor(private notifications: MJNotificationService) {\n super();\n this.ColumnDefs = this.buildColumnDefs();\n }\n\n @Input() CategoryID: string | undefined = undefined;\n\n ngOnInit(): void {\n this.Refresh();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['CategoryID']) {\n this.Refresh();\n }\n }\n\n public OnGridReady(event: GridReadyEvent): void {\n this.gridApi = event.api;\n }\n\n /**\n * Resets the edited file.\n *\n * This method reverts any changes made to the edited file by calling the Revert method of the MJFileEntity class. It then sets the editFile property to undefined, indicating that there is no longer an edited file.\n *\n * @returns void\n */\n public ResetEditFile() {\n this.EditFile?.Revert();\n this.EditFile = undefined;\n }\n\n /** @deprecated Use {@link ResetEditFile}. */\n public resetEditFile() {\n return this.ResetEditFile();\n }\n\n /**\n * Saves the edited file.\n *\n * This method saves the changes made to the edited file. It first checks if there is an edited file available. If so, it sets the isLoading property to true to indicate that the save operation is in progress. Then, it calls the Save method of the edited file to save the changes. If the save operation is successful, it creates a success notification using the MJNotificationService.CreateSimpleNotification method. The notification message includes the ID and name of the saved file. Finally, it sets the edited file to undefined and sets the isLoading property to false to indicate that the save operation is complete.\n *\n * @returns Promise<void> - A promise that resolves when the save operation is complete.\n * @throws Error - If there is an error during the save operation.\n */\n public async SaveEditFile() {\n if (this.EditFile) {\n this.isLoading = true;\n //\n const success = await this.EditFile.Save();\n if (success) {\n this.notifications.CreateSimpleNotification(`Successfully saved file ${this.EditFile.ID} ${this.EditFile.Name}`, 'success');\n this.EditFile = undefined;\n // Refresh the grid to show the updated data\n if (this.gridApi) {\n this.gridApi.setGridOption('rowData', this.Files);\n }\n } else {\n this.notifications.CreateSimpleNotification(`Unable to save file ${this.EditFile.ID} ${this.EditFile.Name}`, 'error');\n }\n this.isLoading = false;\n }\n }\n\n /** @deprecated Use {@link SaveEditFile}. */\n public async saveEditFile() {\n return this.SaveEditFile();\n }\n\n /**\n * Downloads a file using the provided MJFileEntity.\n *\n * @param file - The MJFileEntity representing the file to be downloaded.\n * @returns Promise<void> - A promise that resolves when the file download is complete.\n * @throws Error - If there is an error during the file download process.\n */\n public DownloadFile = async (file: MJFileEntity) => {\n this.isLoading = true;\n const result = await GraphQLDataProvider.ExecuteGQL(FileDownloadQuery, {\n FileID: file.ID,\n });\n const parsedResult = FileDownloadQuerySchema.safeParse(result);\n\n if (parsedResult.success) {\n const downloadUrl = parsedResult.data.MJFile.DownloadUrl;\n const success = downloadFromUrl(downloadUrl, file.Name, file.ContentType);\n if (!success) {\n this.notifications.CreateSimpleNotification(`Unable to download file ${file.ID} ${file.Name}`, 'error');\n }\n } else {\n console.error(parsedResult.error);\n this.notifications.CreateSimpleNotification(`Unable to download file ${file.ID} ${file.Name}`, 'error');\n }\n this.isLoading = false;\n };\n\n /** @deprecated Use {@link DownloadFile}. */\n public get downloadFile() {\n return this.DownloadFile;\n }\n /** @deprecated Use {@link DownloadFile}. */\n public set downloadFile(value) {\n this.DownloadFile = value;\n }\n\n /**\n * Determines whether a file can be deleted based on its status and creation time.\n *\n * @param file - The MJFileEntity representing the file to be checked.\n * @returns boolean - True if the file can be deleted, false otherwise.\n */\n public CanBeDeleted(file: MJFileEntity): boolean {\n const status = file.Status;\n const deletable = status === 'Uploaded' || Date.now() - +file.__mj_CreatedAt > 10 * 60 * 60;\n return deletable;\n }\n\n /** @deprecated Use {@link CanBeDeleted}. */\n public canBeDeleted(file: MJFileEntity): boolean {\n return this.CanBeDeleted(file);\n }\n\n /**\n * Deletes a file using the provided MJFileEntity.\n *\n * @param file - The MJFileEntity representing the file to be deleted.\n * @returns Promise<void> - A promise that resolves when the file deletion is complete.\n * @throws Error - If there is an error during the file deletion process.\n */\n public DeleteFile = async (file: MJFileEntity) => {\n this.isLoading = true;\n const ID = file.ID;\n const Name = file.Name;\n const deleteResult = await file.Delete();\n if (deleteResult) {\n this.notifications.CreateSimpleNotification(`Successfully deleted file ${ID} ${Name}`, 'info');\n this.Files = this.Files.filter((f) => typeof f.ID === 'string' && f.ID !== ID);\n } else {\n this.notifications.CreateSimpleNotification(`Unable to delete file ${ID} ${Name}`, 'error');\n }\n this.isLoading = false;\n };\n\n /** @deprecated Use {@link DeleteFile}. */\n public get deleteFile() {\n return this.DeleteFile;\n }\n /** @deprecated Use {@link DeleteFile}. */\n public set deleteFile(value) {\n this.DeleteFile = value;\n }\n\n /**\n * Handles the file upload event, sending a notification in case of failure and otherwise adding\n * the newly uploaded files to the files currently displayed.\n *\n * @param e - The file upload event.\n */\n public HandleFileUpload(e: FileUploadEvent) {\n if (!e.success) {\n this.notifications.CreateSimpleNotification(`Unable to upload file '${e.file.name}'`, 'error');\n return;\n }\n\n this.Files.push(e.file);\n this.Files = [...this.Files]; // trigger AG Grid row data change\n this.isLoading = false;\n }\n\n /** @deprecated Use {@link HandleFileUpload}. */\n public handleFileUpload(e: FileUploadEvent) {\n return this.HandleFileUpload(e);\n }\n\n /**\n * Refreshes the data by running a view and loading the files.\n * @returns {Promise<void>} - A promise that resolves when the data is refreshed.\n */\n async Refresh() {\n this.isLoading = true;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Files',\n ResultType: 'entity_object',\n ...(this.CategoryID !== undefined && { ExtraFilter: `CategoryID='${this.CategoryID}'` }),\n });\n if (result.Success) {\n this.Files = <MJFileEntity[]>result.Results ?? [];\n } else {\n throw new Error('Error loading files: ' + result.ErrorMessage);\n }\n this.isLoading = false;\n }\n\n /**\n * Builds AG Grid column definitions from the entity fields.\n */\n private buildColumnDefs(): ColDef[] {\n return [\n { field: 'ID', headerName: 'ID' },\n { field: 'Category', headerName: 'Category' },\n { field: 'Name', headerName: 'Name' },\n { field: 'Description', headerName: 'Description' },\n { field: 'Status', headerName: 'Status' },\n {\n headerName: 'Actions',\n sortable: false,\n resizable: false,\n filter: false,\n cellRenderer: (params: ICellRendererParams) => {\n const container = document.createElement('div');\n container.className = 'action-buttons';\n\n const downloadBtn = this.createActionButton('fa-download', params.data?.Status !== 'Uploaded');\n downloadBtn.addEventListener('click', () => this.DownloadFile(params.data));\n\n const deleteBtn = this.createActionButton('fa-trash-can', !this.CanBeDeleted(params.data));\n deleteBtn.addEventListener('click', () => this.DeleteFile(params.data));\n\n const editBtn = this.createActionButton('fa-pen-to-square', params.data?.Status !== 'Uploaded');\n editBtn.addEventListener('click', () => { this.EditFile = params.data; });\n\n container.appendChild(downloadBtn);\n container.appendChild(deleteBtn);\n container.appendChild(editBtn);\n\n return container;\n }\n }\n ];\n }\n\n /**\n * Creates a small action button element for the AG Grid cell renderer.\n */\n private createActionButton(iconClass: string, disabled: boolean): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'mj-btn mj-btn-flat mj-btn-sm grid-action-btn';\n btn.disabled = disabled;\n const icon = document.createElement('span');\n icon.className = `fa-solid ${iconClass}`;\n btn.appendChild(icon);\n return btn;\n }\n}\n","<div class=\"container\">\n @if (isLoading) {\n <div class=\"grid-loading-overlay\">\n <mj-loading text=\"Loading files...\" size=\"medium\"></mj-loading>\n </div>\n }\n <ag-grid-angular\n class=\"files-grid\"\n [theme]=\"GridTheme\"\n [rowData]=\"files\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [loading]=\"isLoading\"\n (gridReady)=\"OnGridReady($event)\">\n </ag-grid-angular>\n\n <mj-files-file-upload\n [CategoryID]=\"CategoryID\"\n [disabled]=\"isLoading\"\n (uploadStarted)=\"isLoading = true\"\n (fileUpload)=\"handleFileUpload($event)\"\n ></mj-files-file-upload>\n\n <mj-dialog\n [Visible]=\"!!editFile\"\n Title=\"Edit file\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"resetEditFile()\">\n @if (editFile) {\n <div class=\"edit-form-container\">\n <form #templateForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"name\"\n [(ngModel)]=\"editFile.Name\"\n required\n [disabled]=\"isLoading\" />\n </label>\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Description</span>\n <input\n class=\"mj-input\"\n name=\"description\"\n [(ngModel)]=\"editFile.Description\"\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n }\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveEditFile()\" [disabled]=\"isLoading || !editFile?.Dirty\">Save</button>\n <button mjButton (click)=\"resetEditFile()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"files-grid.js","sourceRoot":"","sources":["../../../src/lib/files-grid/files-grid.ts","../../../src/lib/files-grid/files-grid.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\nimport { RunView } from '@memberjunction/core';\nimport { MJFileEntity } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, gql } from '@memberjunction/graphql-dataprovider';\nimport { MJ_AG_GRID_THEME_PARAMS } from '@memberjunction/ng-shared-generic';\nimport {\n ColDef,\n GridReadyEvent,\n GridApi,\n ModuleRegistry,\n AllCommunityModule,\n themeAlpine,\n type Theme,\n ICellRendererParams\n} from 'ag-grid-community';\nimport { z } from 'zod';\nimport { FileUploadEvent } from '../file-upload/file-upload';\n\n// Register AG Grid modules\nModuleRegistry.registerModules([AllCommunityModule]);\n\n/**\n * Downloads a file from the provided URL.\n *\n * @param url - The URL of the file to be downloaded.\n * @param fileName - The name to be given to the downloaded file.\n * @param contentType - The content type of the file. Defaults to 'application/octet-stream'.\n * @returns Promise<void> - A promise that resolves when the file download is complete.\n */\nconst downloadFromUrl = async (url: string, fileName: string, contentType?: string | null) => {\n // First, fetch the data and create a blob with the correct content type\n const response = await fetch(url);\n if (!response.ok) {\n return false;\n }\n const rawBlob = await response.blob();\n const blob = new Blob([rawBlob], { type: contentType || 'application/octet-stream' });\n\n // Then add a temporary link to the document and click it\n const link = document.createElement('a');\n const blobUrl = window.URL.createObjectURL(blob);\n link.href = blobUrl;\n link.setAttribute('download', fileName);\n document.body.appendChild(link);\n link.click();\n link.parentNode?.removeChild(link);\n window.URL.revokeObjectURL(blobUrl);\n\n return true;\n};\n\nconst FileDownloadQuery = gql`\n query FileDownloadUrl($FileID: String!) {\n MJFile(ID: $FileID) {\n ContentType\n DownloadUrl\n }\n }\n`;\n\nconst FileDownloadQuerySchema = z.object({\n MJFile: z.object({\n ContentType: z.string().optional(),\n DownloadUrl: z.string(),\n }),\n});\n\n@Component({\n standalone: false,\n selector: 'mj-files-grid',\n templateUrl: './files-grid.html',\n styleUrls: ['./files-grid.css'],\n})\nexport class FilesGridComponent extends BaseAngularComponent implements OnInit, OnChanges {\n public Files: MJFileEntity[] = [];\n\n /** @deprecated Use {@link Files}. */\n public get files(): MJFileEntity[] {\n return this.Files;\n }\n /** @deprecated Use {@link Files}. */\n public set files(value: MJFileEntity[]) {\n this.Files = value;\n }\n public isLoading: boolean = false;\n public EditFile: MJFileEntity | undefined;\n\n /** @deprecated Use {@link EditFile}. */\n public get editFile(): MJFileEntity | undefined {\n return this.EditFile;\n }\n /** @deprecated Use {@link EditFile}. */\n public set editFile(value: MJFileEntity | undefined) {\n this.EditFile = value;\n }\n\n // AG Grid configuration\n // Themed from the shared --mj-* token params so this grid follows light/dark and\n // the org brand overlay, matching the main entity/query grids.\n public GridTheme: Theme = themeAlpine.withParams(MJ_AG_GRID_THEME_PARAMS);\n public ColumnDefs: ColDef[] = [];\n public DefaultColDef: ColDef = {\n sortable: true,\n resizable: true,\n filter: false,\n };\n private gridApi: GridApi | null = null;\n\n constructor(private notifications: MJNotificationService) {\n super();\n this.ColumnDefs = this.buildColumnDefs();\n }\n\n @Input() CategoryID: string | undefined = undefined;\n\n ngOnInit(): void {\n this.Refresh();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['CategoryID']) {\n this.Refresh();\n }\n }\n\n public OnGridReady(event: GridReadyEvent): void {\n this.gridApi = event.api;\n }\n\n /**\n * Resets the edited file.\n *\n * This method reverts any changes made to the edited file by calling the Revert method of the MJFileEntity class. It then sets the editFile property to undefined, indicating that there is no longer an edited file.\n *\n * @returns void\n */\n public ResetEditFile() {\n this.EditFile?.Revert();\n this.EditFile = undefined;\n }\n\n /** @deprecated Use {@link ResetEditFile}. */\n public resetEditFile() {\n return this.ResetEditFile();\n }\n\n /**\n * Saves the edited file.\n *\n * This method saves the changes made to the edited file. It first checks if there is an edited file available. If so, it sets the isLoading property to true to indicate that the save operation is in progress. Then, it calls the Save method of the edited file to save the changes. If the save operation is successful, it creates a success notification using the MJNotificationService.CreateSimpleNotification method. The notification message includes the ID and name of the saved file. Finally, it sets the edited file to undefined and sets the isLoading property to false to indicate that the save operation is complete.\n *\n * @returns Promise<void> - A promise that resolves when the save operation is complete.\n * @throws Error - If there is an error during the save operation.\n */\n public async SaveEditFile() {\n if (this.EditFile) {\n this.isLoading = true;\n //\n const success = await this.EditFile.Save();\n if (success) {\n this.notifications.CreateSimpleNotification(`Successfully saved file ${this.EditFile.ID} ${this.EditFile.Name}`, 'success');\n this.EditFile = undefined;\n // Refresh the grid to show the updated data\n if (this.gridApi) {\n this.gridApi.setGridOption('rowData', this.Files);\n }\n } else {\n this.notifications.CreateSimpleNotification(`Unable to save file ${this.EditFile.ID} ${this.EditFile.Name}`, 'error');\n }\n this.isLoading = false;\n }\n }\n\n /** @deprecated Use {@link SaveEditFile}. */\n public async saveEditFile() {\n return this.SaveEditFile();\n }\n\n /**\n * Downloads a file using the provided MJFileEntity.\n *\n * @param file - The MJFileEntity representing the file to be downloaded.\n * @returns Promise<void> - A promise that resolves when the file download is complete.\n * @throws Error - If there is an error during the file download process.\n */\n public DownloadFile = async (file: MJFileEntity) => {\n this.isLoading = true;\n const result = await GraphQLDataProvider.ExecuteGQL(FileDownloadQuery, {\n FileID: file.ID,\n });\n const parsedResult = FileDownloadQuerySchema.safeParse(result);\n\n if (parsedResult.success) {\n const downloadUrl = parsedResult.data.MJFile.DownloadUrl;\n const success = downloadFromUrl(downloadUrl, file.Name, file.ContentType);\n if (!success) {\n this.notifications.CreateSimpleNotification(`Unable to download file ${file.ID} ${file.Name}`, 'error');\n }\n } else {\n console.error(parsedResult.error);\n this.notifications.CreateSimpleNotification(`Unable to download file ${file.ID} ${file.Name}`, 'error');\n }\n this.isLoading = false;\n };\n\n /** @deprecated Use {@link DownloadFile}. */\n public get downloadFile() {\n return this.DownloadFile;\n }\n /** @deprecated Use {@link DownloadFile}. */\n public set downloadFile(value) {\n this.DownloadFile = value;\n }\n\n /**\n * Determines whether a file can be deleted based on its status and creation time.\n *\n * @param file - The MJFileEntity representing the file to be checked.\n * @returns boolean - True if the file can be deleted, false otherwise.\n */\n public CanBeDeleted(file: MJFileEntity): boolean {\n const status = file.Status;\n const deletable = status === 'Uploaded' || Date.now() - +file.__mj_CreatedAt > 10 * 60 * 60;\n return deletable;\n }\n\n /** @deprecated Use {@link CanBeDeleted}. */\n public canBeDeleted(file: MJFileEntity): boolean {\n return this.CanBeDeleted(file);\n }\n\n /**\n * Deletes a file using the provided MJFileEntity.\n *\n * @param file - The MJFileEntity representing the file to be deleted.\n * @returns Promise<void> - A promise that resolves when the file deletion is complete.\n * @throws Error - If there is an error during the file deletion process.\n */\n public DeleteFile = async (file: MJFileEntity) => {\n this.isLoading = true;\n const ID = file.ID;\n const Name = file.Name;\n const deleteResult = await file.Delete();\n if (deleteResult) {\n this.notifications.CreateSimpleNotification(`Successfully deleted file ${ID} ${Name}`, 'info');\n this.Files = this.Files.filter((f) => typeof f.ID === 'string' && f.ID !== ID);\n } else {\n this.notifications.CreateSimpleNotification(`Unable to delete file ${ID} ${Name}`, 'error');\n }\n this.isLoading = false;\n };\n\n /** @deprecated Use {@link DeleteFile}. */\n public get deleteFile() {\n return this.DeleteFile;\n }\n /** @deprecated Use {@link DeleteFile}. */\n public set deleteFile(value) {\n this.DeleteFile = value;\n }\n\n /**\n * Handles the file upload event, sending a notification in case of failure and otherwise adding\n * the newly uploaded files to the files currently displayed.\n *\n * @param e - The file upload event.\n */\n public HandleFileUpload(e: FileUploadEvent) {\n if (!e.success) {\n this.notifications.CreateSimpleNotification(`Unable to upload file '${e.file.name}'`, 'error');\n return;\n }\n\n this.Files.push(e.file);\n this.Files = [...this.Files]; // trigger AG Grid row data change\n this.isLoading = false;\n }\n\n /** @deprecated Use {@link HandleFileUpload}. */\n public handleFileUpload(e: FileUploadEvent) {\n return this.HandleFileUpload(e);\n }\n\n /**\n * Refreshes the data by running a view and loading the files.\n * @returns {Promise<void>} - A promise that resolves when the data is refreshed.\n */\n async Refresh() {\n this.isLoading = true;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView({\n EntityName: 'MJ: Files',\n ResultType: 'entity_object',\n ...(this.CategoryID !== undefined && { ExtraFilter: `CategoryID='${this.CategoryID}'` }),\n });\n if (result.Success) {\n this.Files = <MJFileEntity[]>result.Results ?? [];\n } else {\n throw new Error('Error loading files: ' + result.ErrorMessage);\n }\n this.isLoading = false;\n }\n\n /**\n * Builds AG Grid column definitions from the entity fields.\n */\n private buildColumnDefs(): ColDef[] {\n return [\n { field: 'ID', headerName: 'ID' },\n { field: 'Category', headerName: 'Category' },\n { field: 'Name', headerName: 'Name' },\n { field: 'Description', headerName: 'Description' },\n { field: 'Status', headerName: 'Status' },\n {\n headerName: 'Actions',\n sortable: false,\n resizable: false,\n filter: false,\n cellRenderer: (params: ICellRendererParams) => {\n const container = document.createElement('div');\n\n const downloadBtn = this.createActionButton('fa-download', params.data?.Status !== 'Uploaded');\n downloadBtn.addEventListener('click', () => this.DownloadFile(params.data));\n\n const deleteBtn = this.createActionButton('fa-trash-can', !this.CanBeDeleted(params.data));\n deleteBtn.addEventListener('click', () => this.DeleteFile(params.data));\n\n const editBtn = this.createActionButton('fa-pen-to-square', params.data?.Status !== 'Uploaded');\n editBtn.addEventListener('click', () => { this.EditFile = params.data; });\n\n container.appendChild(downloadBtn);\n container.appendChild(deleteBtn);\n container.appendChild(editBtn);\n\n return container;\n }\n }\n ];\n }\n\n /**\n * Creates a small action button element for the AG Grid cell renderer.\n * Built imperatively, so this component's emulated-encapsulation stylesheet\n * cannot reach it; the canonical mjButton classes are its only styling.\n */\n private createActionButton(iconClass: string, disabled: boolean): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.className = 'mj-btn mj-btn--flat mj-btn--sm';\n btn.disabled = disabled;\n const icon = document.createElement('span');\n icon.className = `fa-solid ${iconClass}`;\n btn.appendChild(icon);\n return btn;\n }\n}\n","<div class=\"container\">\n @if (isLoading) {\n <div class=\"grid-loading-overlay\">\n <mj-loading text=\"Loading files...\" size=\"medium\"></mj-loading>\n </div>\n }\n <ag-grid-angular\n class=\"files-grid\"\n [theme]=\"GridTheme\"\n [rowData]=\"files\"\n [columnDefs]=\"ColumnDefs\"\n [defaultColDef]=\"DefaultColDef\"\n [loading]=\"isLoading\"\n (gridReady)=\"OnGridReady($event)\">\n </ag-grid-angular>\n\n <mj-files-file-upload\n [CategoryID]=\"CategoryID\"\n [disabled]=\"isLoading\"\n (uploadStarted)=\"isLoading = true\"\n (fileUpload)=\"handleFileUpload($event)\"\n ></mj-files-file-upload>\n\n <mj-dialog\n [Visible]=\"!!editFile\"\n Title=\"Edit file\"\n [Width]=\"450\"\n [MinWidth]=\"250\"\n (Close)=\"resetEditFile()\">\n @if (editFile) {\n <div class=\"edit-form-container\">\n <form #templateForm=\"ngForm\">\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Name</span>\n <input\n class=\"mj-input\"\n name=\"name\"\n [(ngModel)]=\"editFile.Name\"\n required\n [disabled]=\"isLoading\" />\n </label>\n <label class=\"mj-form-field\">\n <span class=\"mj-form-label\">Description</span>\n <input\n class=\"mj-input\"\n name=\"description\"\n [(ngModel)]=\"editFile.Description\"\n [disabled]=\"isLoading\" />\n </label>\n </form>\n </div>\n }\n <mj-dialog-actions>\n <button mjButton variant=\"primary\" (click)=\"saveEditFile()\" [disabled]=\"isLoading || !editFile?.Dirty\">Save</button>\n <button mjButton (click)=\"resetEditFile()\" [disabled]=\"isLoading\">Cancel</button>\n </mj-dialog-actions>\n </mj-dialog>\n</div>\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-attachments.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-attachments/record-attachments.component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"record-attachments.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-attachments/record-attachments.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -2043,8 +2043,13 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
2043
2043
|
uploadBinaryStage(file, stageToken, onProgress) {
|
|
2044
2044
|
return new Promise((resolve, reject) => {
|
|
2045
2045
|
let uploadUrl = '/media/upload-stage';
|
|
2046
|
-
|
|
2047
|
-
|
|
2046
|
+
// The configured MJAPI URL (MJAPI_URI, MJ #5674); otherwise the pre-#5674 derivation from the GraphQL URL.
|
|
2047
|
+
const configData = GraphQLDataProvider.Instance?.ConfigData;
|
|
2048
|
+
const gqlUrl = configData?.URL;
|
|
2049
|
+
if (configData?.MJAPIURL) {
|
|
2050
|
+
uploadUrl = `${configData.MJAPIURL}/media/upload-stage`;
|
|
2051
|
+
}
|
|
2052
|
+
else if (gqlUrl && gqlUrl.startsWith('http')) {
|
|
2048
2053
|
uploadUrl = gqlUrl.replace(/\/graphql\/?$/i, '').replace(/\/+$/, '') + '/media/upload-stage';
|
|
2049
2054
|
}
|
|
2050
2055
|
const xhr = new XMLHttpRequest();
|