@memberjunction/ng-file-storage 6.2.0-edge.4 → 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/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
|
@@ -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();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-attachments.component.js","sourceRoot":"","sources":["../../../src/lib/record-attachments/record-attachments.component.ts","../../../src/lib/record-attachments/record-attachments.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n inject,\n ViewChild,\n ElementRef,\n HostListener,\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, RunView, CompositeKey } from '@memberjunction/core';\nimport {\n MJFileEntity,\n MJFileEntityRecordLinkEntity,\n MJFileStorageProviderEntity,\n MJFileStorageAccountEntity,\n FileStorageEngineBase,\n StorageAccountWithProvider,\n UserInfoEngine,\n} from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, gql } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { NavigationService, SharedService } from '@memberjunction/ng-shared';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { z } from 'zod';\nimport {\n RecordAttachmentItem,\n RecordAttachmentsConfig,\n AttachmentViewMode,\n AttachmentMediaType,\n GetAttachmentMediaType,\n FormatAttachmentFileSize,\n} from './record-attachments.types';\nimport {\n BeforeUploadAttachmentEventArgs,\n AfterUploadAttachmentEventArgs,\n BeforeDeleteAttachmentEventArgs,\n AfterDeleteAttachmentEventArgs,\n BeforeUnlinkAttachmentEventArgs,\n AfterUnlinkAttachmentEventArgs,\n BeforeDownloadAttachmentEventArgs,\n AfterDownloadAttachmentEventArgs,\n BeforePreviewAttachmentEventArgs,\n AfterPreviewAttachmentEventArgs,\n BeforeReplaceAttachmentEventArgs,\n AfterReplaceAttachmentEventArgs,\n} from './record-attachments.events';\n\nconst FileFieldsFragment = gql`\n fragment FileFields on MJFile_ {\n Category\n CategoryID\n ContentType\n _mj__CreatedAt\n Description\n ID\n Name\n Provider\n ProviderID\n ProviderKey\n Status\n _mj__UpdatedAt\n }\n`;\n\nconst UploadStorageFileMutation = gql`\n mutation UploadStorageFile($input: UploadStorageFileInput!) {\n UploadStorageFile(input: $input) {\n Success\n FileID\n ErrorMessage\n File {\n Category\n CategoryID\n ContentType\n _mj__CreatedAt\n Description\n ID\n Name\n Provider\n ProviderID\n ProviderKey\n Status\n _mj__UpdatedAt\n }\n }\n }\n`;\n\nconst UploadStorageFileMutationSchema = z.object({\n UploadStorageFile: z.object({\n Success: z.boolean(),\n FileID: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n File: z.object({\n ID: z.string(),\n Name: z.string().optional().nullable(),\n ProviderID: z.string().optional().nullable(),\n Provider: z.string().optional().nullable(),\n ContentType: z.string().optional().nullable(),\n Description: z.string().optional().nullable(),\n Status: z.string().optional().nullable(),\n CategoryID: z.string().optional().nullable(),\n Category: z.string().optional().nullable(),\n }).passthrough().optional().nullable(),\n }),\n});\n\nconst CreateUploadStageTokenMutation = `\n mutation CreateUploadStageToken {\n CreateUploadStageToken {\n Success\n Token\n Url\n ErrorMessage\n }\n }\n`;\n\nconst CreateUploadStageTokenMutationSchema = z.object({\n CreateUploadStageToken: z.object({\n Success: z.boolean(),\n Token: z.string().optional().nullable(),\n Url: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n }),\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().nullable(),\n DownloadUrl: z.string(),\n }),\n});\n\nconst CreateMediaAccessTokenMutation = gql`\n mutation CreateMediaAccessToken($fileId: String!) {\n CreateMediaAccessToken(fileId: $fileId) {\n Success\n Token\n Url\n MimeType\n ErrorMessage\n }\n }\n`;\n\nconst CreateMediaAccessTokenMutationSchema = z.object({\n CreateMediaAccessToken: z.object({\n Success: z.boolean(),\n Token: z.string().optional().nullable(),\n Url: z.string().optional().nullable(),\n MimeType: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n }),\n});\n\nconst CreatePreAuthUploadUrlMutation = gql`\n mutation CreatePreAuthUploadUrl($input: CreatePreAuthUploadUrlInput!) {\n CreatePreAuthUploadUrl(input: $input) {\n UploadUrl\n ProviderKey\n }\n }\n`;\n\nconst CreatePreAuthUploadUrlMutationSchema = z.object({\n CreatePreAuthUploadUrl: z.object({\n UploadUrl: z.string().optional().nullable(),\n ProviderKey: z.string().optional().nullable(),\n }),\n});\n\n/**\n * World-class Angular component for displaying, previewing, uploading,\n * and managing file attachments linked to an entity record.\n *\n * Selector: `mj-record-attachments`\n */\n@Component({\n standalone: false,\n selector: 'mj-record-attachments',\n templateUrl: './record-attachments.component.html',\n styleUrls: ['./record-attachments.component.css'],\n})\nexport class RecordAttachmentsComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n private sanitizer = inject(DomSanitizer);\n\n private static readonly PREF_WIDTH_KEY = 'mj.recordAttachments.width';\n private static readonly PREF_VIEW_MODE_KEY = 'mj.recordAttachments.viewMode';\n\n // ────────────────────────────────────────────────────────────────────\n // Inputs\n // ────────────────────────────────────────────────────────────────────\n\n /** Entity record to load attachments for */\n @Input() Record?: BaseEntity;\n\n /** Explicit EntityID (alternative to passing Record) */\n @Input() EntityID?: string;\n\n /** Explicit RecordID (alternative to passing Record) */\n @Input() RecordID?: string;\n\n /** Bound attachment items (supports direct data-binding / manipulation) */\n @Input() Attachments: RecordAttachmentItem[] = [];\n\n /** Attachment configuration bag */\n @Input() Config?: RecordAttachmentsConfig;\n\n /** Whether the slide panel is visible */\n @Input() Visible: boolean = true;\n\n /** Whether the slide panel is resizable */\n @Input() Resizable: boolean = true;\n\n /** Initial width in px. 0 = auto/persisted setting */\n @Input() WidthPx: number = 0;\n\n /** Minimum panel width in px */\n @Input() MinWidthPx: number = 420;\n\n /** Maximum panel width ratio of viewport */\n @Input() MaxWidthRatio: number = 0.65;\n\n /** Panel title */\n @Input() Title: string = 'Attachments';\n\n /** Permissions / Feature flags */\n @Input() AllowUpload: boolean = true;\n @Input() AllowDelete: boolean = true;\n @Input() AllowUnlink: boolean = true;\n @Input() AllowDownload: boolean = true;\n @Input() AllowPreview: boolean = true;\n @Input() AllowReplace: boolean = true;\n @Input() AllowEditMetadata: boolean = true;\n\n /** UI Controls */\n @Input() ShowProviderFilter: boolean = true;\n @Input() ShowSearch: boolean = true;\n @Input() ViewMode: AttachmentViewMode = 'grid';\n\n // ────────────────────────────────────────────────────────────────────\n // Outputs / Events\n // ────────────────────────────────────────────────────────────────────\n\n @Output() PanelClosed = new EventEmitter<void>();\n @Output() WidthChanged = new EventEmitter<number>();\n @Output() AttachmentCountChanged = new EventEmitter<number>();\n @Output() ViewModeChanged = new EventEmitter<AttachmentViewMode>();\n\n @Output() BeforeUpload = new EventEmitter<BeforeUploadAttachmentEventArgs>();\n @Output() AfterUpload = new EventEmitter<AfterUploadAttachmentEventArgs>();\n\n @Output() BeforeDelete = new EventEmitter<BeforeDeleteAttachmentEventArgs>();\n @Output() AfterDelete = new EventEmitter<AfterDeleteAttachmentEventArgs>();\n\n @Output() BeforeUnlink = new EventEmitter<BeforeUnlinkAttachmentEventArgs>();\n @Output() AfterUnlink = new EventEmitter<AfterUnlinkAttachmentEventArgs>();\n\n @Output() BeforeDownload = new EventEmitter<BeforeDownloadAttachmentEventArgs>();\n @Output() AfterDownload = new EventEmitter<AfterDownloadAttachmentEventArgs>();\n\n @Output() BeforePreview = new EventEmitter<BeforePreviewAttachmentEventArgs>();\n @Output() AfterPreview = new EventEmitter<AfterPreviewAttachmentEventArgs>();\n\n @Output() BeforeReplace = new EventEmitter<BeforeReplaceAttachmentEventArgs>();\n @Output() AfterReplace = new EventEmitter<AfterReplaceAttachmentEventArgs>();\n\n // ────────────────────────────────────────────────────────────────────\n // Internal State\n // ────────────────────────────────────────────────────────────────────\n\n @ViewChild('fileInputRef') FileInputRef?: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link FileInputRef}. */\n get fileInputRef(): ElementRef<HTMLInputElement> | undefined {\n return this.FileInputRef;\n }\n /** @deprecated Use {@link FileInputRef}. */\n set fileInputRef(value: ElementRef<HTMLInputElement> | undefined) {\n this.FileInputRef = value;\n }\n @ViewChild('replaceInputRef') ReplaceInputRef?: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link ReplaceInputRef}. */\n get replaceInputRef(): ElementRef<HTMLInputElement> | undefined {\n return this.ReplaceInputRef;\n }\n /** @deprecated Use {@link ReplaceInputRef}. */\n set replaceInputRef(value: ElementRef<HTMLInputElement> | undefined) {\n this.ReplaceInputRef = value;\n }\n\n public IsLoading: boolean = false;\n public IsUploading: boolean = false;\n public UploadProgressPercent: number = 0;\n public UploadStatusText: string = '';\n public UploadingFileName: string = '';\n public SearchTerm: string = '';\n public SelectedProviderFilter: string = 'all'; // 'all' or ProviderID\n\n public StorageAccounts: StorageAccountWithProvider[] = [];\n public ActiveProviders: MJFileStorageProviderEntity[] = [];\n public SelectedStorageAccountID: string = '';\n\n /** User Permissions */\n public UserCanCreateFile: boolean = true;\n public UserCanDeleteFile: boolean = true;\n public UserCanUpdateFile: boolean = true;\n public UserCanCreateLink: boolean = true;\n public UserCanDeleteLink: boolean = true;\n\n /** Active Preview State */\n public PreviewModalOpen: boolean = false;\n public IsLoadingPreview: boolean = false;\n public IsMediaLoaded: boolean = false;\n public ActivePreviewItem: RecordAttachmentItem | null = null;\n public ActivePreviewUrl: string | null = null;\n public ActivePreviewSafeUrl: SafeResourceUrl | null = null;\n public ActivePreviewTextContent: string | null = null;\n\n /** Replace Target */\n private pendingReplaceItem: RecordAttachmentItem | null = null;\n private navigationService = inject(NavigationService, { optional: true });\n private mediaLoadedTimer?: ReturnType<typeof setTimeout>;\n\n /** Edit Metadata Dialog */\n public EditMetadataModalOpen: boolean = false;\n public EditMetadataItem: RecordAttachmentItem | null = null;\n public EditMetadataName: string = '';\n public EditMetadataDescription: string = '';\n\n /** Active Overflow Menu */\n public ActiveMenuLinkID: string | null = null;\n\n // ────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ────────────────────────────────────────────────────────────────────\n\n async ngOnInit(): Promise<void> {\n this.restoreUserPreferences();\n await this.checkStorageAndPermissions();\n if (this.Attachments.length === 0 && (this.Record || (this.EntityID && this.RecordID))) {\n await this.Refresh();\n }\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['Record'] || changes['EntityID'] || changes['RecordID']) {\n if (!changes['Record']?.firstChange && !changes['EntityID']?.firstChange && !changes['RecordID']?.firstChange) {\n await this.Refresh();\n }\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Preferences & Permissions\n // ────────────────────────────────────────────────────────────────────\n\n private restoreUserPreferences(): void {\n const savedWidth = UserInfoEngine.Instance.GetSetting(RecordAttachmentsComponent.PREF_WIDTH_KEY);\n if (savedWidth && !this.WidthPx) {\n this.WidthPx = parseInt(savedWidth, 10) || 520;\n } else if (!this.WidthPx) {\n this.WidthPx = 520;\n }\n\n const savedMode = UserInfoEngine.Instance.GetSetting(RecordAttachmentsComponent.PREF_VIEW_MODE_KEY);\n if (savedMode === 'grid' || savedMode === 'list') {\n this.ViewMode = savedMode;\n }\n }\n\n public OnWidthChanged(width: number): void {\n this.WidthPx = width;\n UserInfoEngine.Instance.SetSettingDebounced(RecordAttachmentsComponent.PREF_WIDTH_KEY, String(width));\n this.WidthChanged.emit(width);\n }\n\n public SetViewMode(mode: AttachmentViewMode): void {\n this.ViewMode = mode;\n UserInfoEngine.Instance.SetSettingDebounced(RecordAttachmentsComponent.PREF_VIEW_MODE_KEY, mode);\n this.ViewModeChanged.emit(mode);\n this.cdr.markForCheck();\n }\n\n private async checkStorageAndPermissions(): Promise<void> {\n try {\n await FileStorageEngineBase.Instance.Config(false);\n this.ActiveProviders = FileStorageEngineBase.Instance.Providers.filter((p) => p.IsActive !== false);\n this.StorageAccounts = FileStorageEngineBase.Instance.AccountsWithProviders.filter((ap) => ap.provider.IsActive !== false);\n\n // If initial cached check returns 0 accounts, force refresh from server in case cache was cold or stale\n if (this.StorageAccounts.length === 0) {\n await FileStorageEngineBase.Instance.Config(true);\n this.ActiveProviders = FileStorageEngineBase.Instance.Providers.filter((p) => p.IsActive !== false);\n this.StorageAccounts = FileStorageEngineBase.Instance.AccountsWithProviders.filter((ap) => ap.provider.IsActive !== false);\n }\n\n if (this.StorageAccounts.length > 0) {\n const preferredId = this.Config?.DefaultStorageAccountID;\n const matching = this.StorageAccounts.find((sa) => UUIDsEqual(sa.account.ID, preferredId));\n this.SelectedStorageAccountID = matching ? matching.account.ID : this.StorageAccounts[0].account.ID;\n }\n\n // Check Entity Permissions\n const md = this.ProviderToUse;\n const fileEntity = md.Entities.find((e) => e.Name === 'MJ: Files');\n const linkEntity = md.Entities.find((e) => e.Name === 'MJ: File Entity Record Links');\n const user = md.CurrentUser;\n\n if (fileEntity && user) {\n const perm = fileEntity.GetUserPermisions(user);\n this.UserCanCreateFile = perm.CanCreate;\n this.UserCanDeleteFile = perm.CanDelete;\n this.UserCanUpdateFile = perm.CanUpdate;\n }\n if (linkEntity && user) {\n const perm = linkEntity.GetUserPermisions(user);\n this.UserCanCreateLink = perm.CanCreate;\n this.UserCanDeleteLink = perm.CanDelete;\n }\n } catch (err) {\n console.warn('[RecordAttachmentsComponent] Storage check error:', err);\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Effective IDs\n // ────────────────────────────────────────────────────────────────────\n\n public get EffectiveEntityID(): string | null {\n if (this.Record?.EntityInfo?.ID) return this.Record.EntityInfo.ID;\n return this.EntityID ?? null;\n }\n\n public get EffectiveRecordID(): string | null {\n if (this.Record) {\n if (this.Record.PrimaryKey?.KeyValuePairs?.length > 0) {\n const val = this.Record.PrimaryKey.KeyValuePairs[0].Value;\n if (val !== null && val !== undefined && String(val).length > 0) return String(val);\n }\n const pkVal = this.Record.PrimaryKey?.GetValueByIndex(0);\n if (pkVal !== null && pkVal !== undefined && String(pkVal).length > 0) return String(pkVal);\n if ('ID' in this.Record && (this.Record as unknown as { ID: string }).ID) {\n return String((this.Record as unknown as { ID: string }).ID);\n }\n }\n return this.RecordID ?? null;\n }\n\n public get EffectiveAllowUpload(): boolean {\n return this.AllowUpload && this.UserCanCreateFile && this.UserCanCreateLink && this.StorageAccounts.length > 0;\n }\n\n public get EffectiveAllowDelete(): boolean {\n return this.AllowDelete && this.UserCanDeleteFile && this.UserCanDeleteLink;\n }\n\n public get EffectiveAllowUnlink(): boolean {\n return this.AllowUnlink && this.UserCanDeleteLink;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Filtering & Computed Lists\n // ────────────────────────────────────────────────────────────────────\n\n public get FilteredAttachments(): RecordAttachmentItem[] {\n const term = (this.SearchTerm || '').toLowerCase().trim();\n const provider = this.SelectedProviderFilter;\n\n return this.Attachments.filter((item) => {\n const matchesProvider =\n provider === 'all' ||\n UUIDsEqual(item.ProviderID, provider) ||\n UUIDsEqual(item.StorageAccountID, provider);\n\n const matchesSearch =\n !term ||\n item.Name.toLowerCase().includes(term) ||\n (item.Description && item.Description.toLowerCase().includes(term)) ||\n (item.CategoryName && item.CategoryName.toLowerCase().includes(term)) ||\n (item.ContentType && item.ContentType.toLowerCase().includes(term));\n\n return matchesProvider && matchesSearch;\n });\n }\n\n public get ProviderCounts(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.Attachments) {\n const pid = item.ProviderID || 'unknown';\n counts.set(pid, (counts.get(pid) ?? 0) + 1);\n }\n return counts;\n }\n\n public GetProviderItemCount(providerId: string): number {\n return this.ProviderCounts.get(providerId) ?? 0;\n }\n\n public get TotalSizeFormatted(): string {\n const totalBytes = this.Attachments.reduce((acc, curr) => acc + (curr.FileSize ?? 0), 0);\n return FormatAttachmentFileSize(totalBytes);\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Public Verbs / Methods\n // ────────────────────────────────────────────────────────────────────\n\n /**\n * Refreshes the linked attachments list by querying `MJ: File Entity Record Links` and `MJ: Files`.\n */\n public async Refresh(): Promise<void> {\n const entityId = this.EffectiveEntityID;\n const recordId = this.EffectiveRecordID;\n\n if (!entityId || !recordId) {\n return;\n }\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n await this.checkStorageAndPermissions();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const linksResult = await rv.RunView<MJFileEntityRecordLinkEntity>({\n EntityName: 'MJ: File Entity Record Links',\n ExtraFilter: `EntityID='${entityId}' AND RecordID='${recordId}'`,\n ResultType: 'entity_object',\n });\n\n if (!linksResult.Success || !linksResult.Results) {\n this.Attachments = [];\n this.AttachmentCountChanged.emit(0);\n return;\n }\n\n const fileIds = linksResult.Results.map((link) => link.FileID).filter((id): id is string => !!id);\n\n if (fileIds.length === 0) {\n this.Attachments = [];\n this.AttachmentCountChanged.emit(0);\n return;\n }\n\n // Batch load files\n const fileFilter = fileIds.map((id) => `ID='${id}'`).join(' OR ');\n const filesResult = await rv.RunView<MJFileEntity>({\n EntityName: 'MJ: Files',\n ExtraFilter: fileFilter,\n ResultType: 'entity_object',\n });\n\n const filesMap = new Map<string, MJFileEntity>();\n if (filesResult.Success && filesResult.Results) {\n for (const file of filesResult.Results) {\n filesMap.set(NormalizeUUID(file.ID), file);\n }\n }\n\n // Map to RecordAttachmentItem\n this.Attachments = linksResult.Results.map((link) => {\n const file = link.FileID ? filesMap.get(NormalizeUUID(link.FileID)) : undefined;\n const provider = file?.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, file.ProviderID)) : undefined;\n const config = provider?.ConfigurationObject;\n return {\n LinkID: link.ID,\n FileID: link.FileID,\n Name: file?.Name ?? 'Untitled File',\n Description: file?.Description,\n ContentType: file?.ContentType,\n Status: file?.Status,\n ProviderName: file?.Provider,\n ProviderID: file?.ProviderID,\n ProviderIconClass: config?.IconClass || this.GetFallbackProviderIcon(file?.Provider),\n ProviderBrandColor: config?.BrandColor || undefined,\n CategoryID: file?.CategoryID,\n CategoryName: file?.Category,\n CreatedAt: file?.__mj_CreatedAt ? new Date(file.__mj_CreatedAt) : link.__mj_CreatedAt ? new Date(link.__mj_CreatedAt) : null,\n UpdatedAt: file?.__mj_UpdatedAt ? new Date(file.__mj_UpdatedAt) : null,\n FileEntity: file,\n LinkEntity: link,\n };\n });\n\n this.AttachmentCountChanged.emit(this.Attachments.length);\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Refresh error:', err);\n this.notifications.CreateSimpleNotification('Failed to load attachments', 'error');\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Uploads one or more files and links them to the active record.\n */\n public async UploadFiles(files: File[], storageAccountId?: string, categoryId?: string): Promise<RecordAttachmentItem[]> {\n console.log('[RecordAttachmentsComponent] UploadFiles called with', files.length, 'file(s):', files.map(f => ({ name: f.name, size: f.size, type: f.type })));\n\n if (!files || files.length === 0) return [];\n\n const entityId = this.EffectiveEntityID;\n const recordId = this.EffectiveRecordID;\n\n console.log('[RecordAttachmentsComponent] Resolved upload context:', {\n entityId,\n recordId,\n recordName: this.Record?.EntityInfo?.Name,\n explicitEntityID: this.EntityID,\n explicitRecordID: this.RecordID,\n storageAccountsAvailable: this.StorageAccounts.length,\n selectedStorageAccountID: this.SelectedStorageAccountID\n });\n\n if (!entityId || !recordId) {\n const errMsg = `Cannot upload attachments: Missing record context (EntityID: ${entityId}, RecordID: ${recordId})`;\n console.error(`[RecordAttachmentsComponent] ${errMsg}`);\n this.notifications.CreateSimpleNotification('Cannot upload attachments: No record context available', 'error');\n return [];\n }\n\n if (this.StorageAccounts.length === 0) {\n const errMsg = 'Cannot upload attachments: No active file storage accounts are configured. Please configure a storage provider in system settings.';\n console.warn(`[RecordAttachmentsComponent] ${errMsg}`);\n this.notifications.CreateSimpleNotification(errMsg, 'warning');\n return [];\n }\n\n const targetAccountID = storageAccountId ?? this.SelectedStorageAccountID ?? this.StorageAccounts[0]?.account?.ID;\n const targetCategoryID = categoryId ?? this.Config?.DefaultCategoryID;\n\n // Fire BeforeUpload event\n const beforeEvent = new BeforeUploadAttachmentEventArgs(files, targetAccountID, targetCategoryID);\n this.BeforeUpload.emit(beforeEvent);\n if (beforeEvent.Cancel) {\n console.log('[RecordAttachmentsComponent] Upload cancelled by BeforeUpload event');\n return [];\n }\n\n this.IsUploading = true;\n this.UploadProgressPercent = 5;\n this.UploadStatusText = `Preparing ${files.length} file${files.length === 1 ? '' : 's'}...`;\n this.cdr.markForCheck();\n\n const uploadedItems: RecordAttachmentItem[] = [];\n const uploadedFileEntities: MJFileEntity[] = [];\n\n try {\n const md = this.ProviderToUse;\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const fileIndex = i + 1;\n const progressBase = Math.round((i / files.length) * 100);\n\n this.UploadingFileName = file.name;\n this.UploadStatusText = `Reading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 10);\n this.cdr.markForCheck();\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Starting upload for '${file.name}' (${FormatAttachmentFileSize(file.size)}, type: '${file.type}')`);\n\n // Enforce max size if configured\n if (this.Config?.MaxFileSizeBytes && file.size > this.Config.MaxFileSizeBytes) {\n const maxStr = FormatAttachmentFileSize(this.Config.MaxFileSizeBytes);\n console.warn(`[RecordAttachmentsComponent] File '${file.name}' exceeds max size of ${maxStr}`);\n this.notifications.CreateSimpleNotification(`File '${file.name}' exceeds max size of ${maxStr}`, 'error');\n continue;\n }\n\n let fileId: string | null = null;\n let fileEntity: MJFileEntity | null = null;\n let directUploadSucceeded = false;\n\n const targetAccount = this.StorageAccounts.find((a) => UUIDsEqual(a.account.ID, targetAccountID));\n const timestamp = new Date().toISOString().slice(0, 10);\n const uniqueId = typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 11);\n const objectPath = `artifacts/${timestamp}/${uniqueId}/${file.name}`;\n\n // ─────────────────────────────────────────────────────────────────────\n // 1. Try Direct Binary Upload via Pre-Authenticated URL (for S3, Azure Blob, GCS)\n // ─────────────────────────────────────────────────────────────────────\n const supportsDirectPreAuth = this.providerSupportsDirectUpload(targetAccount?.provider);\n if (supportsDirectPreAuth) {\n try {\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Requesting pre-auth upload URL for '${file.name}' on account '${targetAccountID}'...`);\n const preAuthResult = await GraphQLDataProvider.ExecuteGQL(CreatePreAuthUploadUrlMutation, {\n input: {\n AccountID: targetAccountID,\n ObjectName: objectPath,\n ContentType: file.type || 'application/octet-stream',\n },\n });\n\n const parsedPreAuth = CreatePreAuthUploadUrlMutationSchema.safeParse(preAuthResult);\n if (\n parsedPreAuth.success &&\n parsedPreAuth.data.CreatePreAuthUploadUrl.UploadUrl\n ) {\n const preAuth = parsedPreAuth.data.CreatePreAuthUploadUrl;\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Direct binary upload URL obtained. Streaming raw bytes...`);\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}) directly to storage...`;\n this.cdr.markForCheck();\n\n if (preAuth.UploadUrl) {\n await this.uploadBinaryDirect(\n preAuth.UploadUrl,\n file,\n (loaded, total) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const percent = Math.round((loaded / total) * 100);\n const computedPercent = Math.min(95, Math.round(currentFileBase + (percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(loaded);\n const totalStr = FormatAttachmentFileSize(total);\n if (percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${percent}%)...`;\n } else {\n this.UploadStatusText = `Registering ${file.name} in MemberJunction...`;\n }\n this.cdr.markForCheck();\n }\n );\n\n // Raw binary upload to cloud storage succeeded! Create MJ: Files database record\n this.UploadStatusText = `Saving ${file.name} record...`;\n this.cdr.markForCheck();\n\n const newFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n newFile.Name = file.name;\n newFile.ContentType = file.type || 'application/octet-stream';\n newFile.ProviderID = targetAccount?.provider?.ID || '';\n newFile.ProviderKey = preAuth.ProviderKey || objectPath;\n if (targetCategoryID) {\n newFile.CategoryID = targetCategoryID;\n }\n newFile.Status = 'Uploaded';\n const saved = await newFile.Save();\n if (saved) {\n fileEntity = newFile;\n fileId = newFile.ID;\n directUploadSucceeded = true;\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Direct binary upload & file record created (FileID: ${fileId})`);\n }\n }\n }\n } catch (preAuthErr) {\n console.warn(`[RecordAttachmentsComponent] Direct binary upload failed for '${file.name}', falling back to server upload:`, preAuthErr);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────\n // 2. Tier 2: Ephemeral Binary Upload Staging + GraphQL Token Commit\n // ─────────────────────────────────────────────────────────────────────\n if (!directUploadSucceeded || !fileId) {\n try {\n // Mint a cryptographically signed media-upload staging token\n const mintResult = await GraphQLDataProvider.ExecuteGQL(CreateUploadStageTokenMutation, {});\n const parsedMint = CreateUploadStageTokenMutationSchema.safeParse(mintResult);\n const stageToken = parsedMint.success && parsedMint.data.CreateUploadStageToken.Success\n ? parsedMint.data.CreateUploadStageToken.Token\n : null;\n\n if (!stageToken) {\n throw new Error('Failed to obtain authenticated upload staging token.');\n }\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Staging binary bytes via /media/upload-stage...`);\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 2);\n this.cdr.markForCheck();\n\n const uploadToken = await this.uploadBinaryStage(file, stageToken, (loaded, total) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const percent = Math.round((loaded / total) * 100);\n const computedPercent = Math.min(95, Math.round(currentFileBase + (percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(loaded);\n const totalStr = FormatAttachmentFileSize(total);\n if (percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${percent}%)...`;\n } else {\n this.UploadStatusText = `Saving ${file.name} to storage provider...`;\n }\n this.cdr.markForCheck();\n });\n\n this.UploadStatusText = `Finalizing ${file.name} in MemberJunction...`;\n this.cdr.markForCheck();\n\n const gqlResult = await GraphQLDataProvider.ExecuteGQL(UploadStorageFileMutation, {\n input: {\n UploadToken: uploadToken,\n FileName: file.name,\n MimeType: file.type || 'application/octet-stream',\n AccountID: beforeEvent.StorageAccountID || undefined,\n CategoryID: beforeEvent.CategoryID || undefined,\n },\n });\n\n const parsed = UploadStorageFileMutationSchema.safeParse(gqlResult);\n if (parsed.success && parsed.data.UploadStorageFile.Success && parsed.data.UploadStorageFile.FileID) {\n fileId = parsed.data.UploadStorageFile.FileID;\n const loadedFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n const ok = await loadedFile.Load(fileId);\n if (ok) {\n fileEntity = loadedFile;\n directUploadSucceeded = true;\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Tier 2 binary staging & upload completed (FileID: ${fileId})`);\n }\n }\n } catch (stageErr) {\n console.warn(`[RecordAttachmentsComponent] Tier 2 binary staging failed, falling back to base64:`, stageErr);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────\n // 3. Tier 3 (Fallback): Base64 Upload via UploadStorageFile mutation\n // ─────────────────────────────────────────────────────────────────────\n if (!directUploadSucceeded || !fileId) {\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Using Tier 3 fallback base64 server upload...`);\n const base64Data = await this.fileToBase64(file);\n\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 2);\n this.cdr.markForCheck();\n\n const input = {\n FileName: file.name,\n Base64Data: base64Data,\n MimeType: file.type || 'application/octet-stream',\n AccountID: beforeEvent.StorageAccountID || undefined,\n CategoryID: beforeEvent.CategoryID || undefined,\n };\n\n const gqlResult = await GraphQLDataProvider.ExecuteGQLWithProgress(\n UploadStorageFileMutation,\n { input },\n (progress) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const computedPercent = Math.min(95, Math.round(currentFileBase + (progress.percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(progress.loaded);\n const totalStr = FormatAttachmentFileSize(progress.total);\n if (progress.percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${progress.percent}%)...`;\n } else {\n this.UploadStatusText = `Processing ${file.name} on storage server...`;\n }\n this.cdr.markForCheck();\n }\n );\n\n const parsed = UploadStorageFileMutationSchema.safeParse(gqlResult);\n if (!parsed.success || !parsed.data.UploadStorageFile.Success || !parsed.data.UploadStorageFile.FileID) {\n const errorMsg = parsed.success ? parsed.data.UploadStorageFile.ErrorMessage : 'Upload response parsing failed';\n console.error(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Failed to upload '${file.name}':`, errorMsg, parsed);\n this.notifications.CreateSimpleNotification(`Failed to upload '${file.name}': ${errorMsg || 'Unknown error'}`, 'error');\n continue;\n }\n\n fileId = parsed.data.UploadStorageFile.FileID;\n const loadedFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n const ok = await loadedFile.Load(fileId);\n if (ok) {\n fileEntity = loadedFile;\n }\n }\n\n if (!fileId || !fileEntity) {\n console.error(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] File record unavailable for '${file.name}'`);\n continue;\n }\n\n uploadedFileEntities.push(fileEntity);\n\n this.UploadStatusText = `Linking ${file.name} to record...`;\n this.UploadProgressPercent = progressBase + Math.round((1 / files.length) * 95);\n this.cdr.markForCheck();\n\n // Create Link Entity\n const linkEntity: MJFileEntityRecordLinkEntity = await md.GetEntityObject('MJ: File Entity Record Links');\n linkEntity.FileID = fileId;\n linkEntity.EntityID = entityId;\n linkEntity.RecordID = recordId;\n const linkSuccess = await linkEntity.Save();\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Record link saved (success: ${linkSuccess}, LinkID: ${linkEntity.ID})`);\n\n if (linkSuccess && fileEntity) {\n const provider = fileEntity.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, fileEntity.ProviderID)) : undefined;\n const config = provider?.ConfigurationObject;\n const newItem: RecordAttachmentItem = {\n LinkID: linkEntity.ID,\n FileID: fileEntity.ID,\n Name: fileEntity.Name,\n Description: fileEntity.Description,\n ContentType: fileEntity.ContentType,\n Status: fileEntity.Status,\n ProviderName: fileEntity.Provider,\n ProviderID: fileEntity.ProviderID,\n ProviderIconClass: config?.IconClass || this.GetFallbackProviderIcon(fileEntity.Provider),\n ProviderBrandColor: config?.BrandColor || undefined,\n CategoryID: fileEntity.CategoryID,\n CategoryName: fileEntity.Category,\n CreatedAt: new Date(),\n FileSize: file.size,\n FileEntity: fileEntity,\n LinkEntity: linkEntity,\n };\n uploadedItems.push(newItem);\n this.Attachments.unshift(newItem);\n }\n }\n\n this.UploadProgressPercent = 100;\n this.UploadStatusText = 'Upload complete!';\n this.cdr.markForCheck();\n\n if (uploadedItems.length > 0) {\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterUpload.emit(new AfterUploadAttachmentEventArgs(uploadedItems, uploadedFileEntities));\n this.notifications.CreateSimpleNotification(\n `Successfully attached ${uploadedItems.length} file${uploadedItems.length === 1 ? '' : 's'}`,\n 'success'\n );\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Upload error:', err);\n const errMsg = err instanceof Error ? err.message : 'Error uploading attachments';\n this.notifications.CreateSimpleNotification(errMsg, 'error');\n } finally {\n this.IsUploading = false;\n this.UploadProgressPercent = 0;\n this.UploadStatusText = '';\n this.UploadingFileName = '';\n this.cdr.markForCheck();\n }\n\n return uploadedItems;\n }\n\n /**\n * Unlinks an attachment from the record (keeps file in storage).\n */\n public async UnlinkAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforeUnlinkAttachmentEventArgs(attachment);\n this.BeforeUnlink.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const linkEntity: MJFileEntityRecordLinkEntity = attachment.LinkEntity ?? (await md.GetEntityObject('MJ: File Entity Record Links'));\n if (!attachment.LinkEntity) {\n await linkEntity.Load(attachment.LinkID);\n }\n\n const success = await linkEntity.Delete();\n if (success) {\n this.Attachments = this.Attachments.filter((a) => !UUIDsEqual(a.LinkID, attachment.LinkID));\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterUnlink.emit(new AfterUnlinkAttachmentEventArgs(attachment));\n this.notifications.CreateSimpleNotification(`Unlinked '${attachment.Name}' from record`, 'info');\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Failed to unlink '${attachment.Name}'`, 'error');\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Unlink error:', err);\n this.notifications.CreateSimpleNotification('Failed to unlink attachment', 'error');\n return false;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Deletes an attachment completely (unlinks and deletes from storage provider).\n */\n public async DeleteAttachment(attachment: RecordAttachmentItem, hardDelete: boolean = true): Promise<boolean> {\n const beforeEvent = new BeforeDeleteAttachmentEventArgs(attachment, hardDelete);\n this.BeforeDelete.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n\n // 1. Delete link\n if (attachment.LinkID) {\n const linkEntity: MJFileEntityRecordLinkEntity = attachment.LinkEntity ?? (await md.GetEntityObject('MJ: File Entity Record Links'));\n if (!attachment.LinkEntity) {\n await linkEntity.Load(attachment.LinkID);\n }\n await linkEntity.Delete();\n }\n\n // 2. Delete file if hardDelete requested\n if (hardDelete && attachment.FileID) {\n const fileEntity: MJFileEntity = attachment.FileEntity ?? (await md.GetEntityObject('MJ: Files'));\n if (!attachment.FileEntity) {\n await fileEntity.Load(attachment.FileID);\n }\n await fileEntity.Delete();\n }\n\n this.Attachments = this.Attachments.filter((a) => !UUIDsEqual(a.LinkID, attachment.LinkID));\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterDelete.emit(new AfterDeleteAttachmentEventArgs(attachment, hardDelete));\n this.notifications.CreateSimpleNotification(`Deleted '${attachment.Name}'`, 'info');\n return true;\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Delete error:', err);\n this.notifications.CreateSimpleNotification('Failed to delete attachment', 'error');\n return false;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Resolves an authenticated inline URL for streaming, previewing, and opening in a new tab.\n * Prefers the inline streaming endpoint (/media/:fileId?token=...) so the browser renders\n * the document/media natively without triggering forced attachment downloads or Save As dialogs.\n */\n private async getInlineFileUrl(fileId: string): Promise<string | null> {\n try {\n const mediaResult = await GraphQLDataProvider.ExecuteGQL(CreateMediaAccessTokenMutation, { fileId });\n const parsedMedia = CreateMediaAccessTokenMutationSchema.safeParse(mediaResult);\n if (parsedMedia.success && parsedMedia.data.CreateMediaAccessToken.Success && parsedMedia.data.CreateMediaAccessToken.Url) {\n return parsedMedia.data.CreateMediaAccessToken.Url;\n }\n } catch (err) {\n console.warn('[RecordAttachmentsComponent] CreateMediaAccessToken failed, trying fallback DownloadUrl:', err);\n }\n\n try {\n const gqlResult = await GraphQLDataProvider.ExecuteGQL(FileDownloadQuery, { FileID: fileId });\n const parsed = FileDownloadQuerySchema.safeParse(gqlResult);\n if (parsed.success && parsed.data.MJFile?.DownloadUrl) {\n return parsed.data.MJFile.DownloadUrl;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] GetInlineFileUrl fallback failed:', err);\n }\n\n return null;\n }\n\n /**\n * Opens the attachment in a new browser tab for direct viewing.\n */\n public async DownloadAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforeDownloadAttachmentEventArgs(attachment);\n this.BeforeDownload.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n try {\n const url = await this.getInlineFileUrl(attachment.FileID);\n if (url) {\n // Open directly in a new tab so the browser displays the document\n window.open(url, '_blank', 'noopener,noreferrer');\n this.AfterDownload.emit(new AfterDownloadAttachmentEventArgs(attachment, url));\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Unable to open '${attachment.Name}'`, 'error');\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Open in tab error:', err);\n this.notifications.CreateSimpleNotification('Failed to open file', 'error');\n return false;\n }\n }\n\n /**\n * Opens the in-app rich media preview modal for an attachment.\n */\n public async PreviewAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforePreviewAttachmentEventArgs(attachment);\n this.BeforePreview.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.ActivePreviewItem = attachment;\n this.IsLoadingPreview = true;\n this.IsMediaLoaded = false;\n this.PreviewModalOpen = true;\n this.ActivePreviewUrl = null;\n this.ActivePreviewSafeUrl = null;\n this.ActivePreviewTextContent = null;\n this.cdr.markForCheck();\n\n try {\n const url = await this.getInlineFileUrl(attachment.FileID);\n if (url) {\n this.ActivePreviewUrl = url;\n this.ActivePreviewSafeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);\n\n // For text media types, fetch content directly for syntax preview\n const mediaType = this.GetMediaType(attachment);\n if (mediaType === 'text') {\n try {\n const resp = await window.fetch(url);\n if (resp.ok) {\n this.ActivePreviewTextContent = await resp.text();\n }\n } catch {\n // Text fetch failed, fallback to viewer\n }\n this.IsMediaLoaded = true;\n }\n\n this.AfterPreview.emit(new AfterPreviewAttachmentEventArgs(attachment));\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Unable to load preview for '${attachment.Name}'`, 'error');\n this.IsMediaLoaded = true;\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Preview error:', err);\n this.notifications.CreateSimpleNotification('Preview failed', 'error');\n this.IsMediaLoaded = true;\n return false;\n } finally {\n this.IsLoadingPreview = false;\n this.cdr.markForCheck();\n }\n }\n\n public OnPreviewMediaLoaded(): void {\n if (this.mediaLoadedTimer) clearTimeout(this.mediaLoadedTimer);\n // Smoothly retain loading spinner for ~350ms so internal iframe/canvas rasterization finishes before fade-in\n this.mediaLoadedTimer = setTimeout(() => {\n this.IsMediaLoaded = true;\n this.cdr.markForCheck();\n }, 350);\n }\n\n /**\n * Opens the file record in a dedicated MJ Explorer workspace tab and closes the attachments slide-in panel.\n * If running standalone/outside Explorer, falls back to opening the in-app media preview modal.\n */\n public OpenAttachmentRecord(attachment: RecordAttachmentItem): void {\n if (attachment.FileID) {\n const pkey = CompositeKey.FromID(attachment.FileID); // first-pk-ok: FileID is the FK to MJ: Files (opened two lines below) — core entity keyed by ID\n if (this.navigationService) {\n this.navigationService.OpenEntityRecord('MJ: Files', pkey);\n } else {\n SharedService.Instance.OpenEntityRecord('MJ: Files', pkey);\n }\n this.ClosePanel();\n this.ClosePreviewModal();\n } else {\n void this.PreviewAttachment(attachment);\n }\n }\n\n /**\n * Initiates replace workflow for an existing attachment.\n */\n public RequestReplace(attachment: RecordAttachmentItem): void {\n this.pendingReplaceItem = attachment;\n this.ReplaceInputRef?.nativeElement.click();\n }\n\n /**\n * Replaces an existing attachment with a newly uploaded file.\n */\n public async ReplaceAttachment(attachment: RecordAttachmentItem, newFile: File): Promise<RecordAttachmentItem | null> {\n const beforeEvent = new BeforeReplaceAttachmentEventArgs(attachment, newFile);\n this.BeforeReplace.emit(beforeEvent);\n if (beforeEvent.Cancel) return null;\n\n this.IsUploading = true;\n this.cdr.markForCheck();\n\n try {\n // 1. Upload new file\n const uploaded = await this.UploadFiles([newFile], attachment.StorageAccountID || undefined, attachment.CategoryID || undefined);\n if (uploaded.length === 0) return null;\n\n const newAttachment = uploaded[0];\n\n // 2. Unlink old file\n await this.UnlinkAttachment(attachment);\n\n this.AfterReplace.emit(new AfterReplaceAttachmentEventArgs(attachment, newAttachment));\n this.notifications.CreateSimpleNotification(`Replaced '${attachment.Name}' with '${newAttachment.Name}'`, 'success');\n return newAttachment;\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Replace error:', err);\n this.notifications.CreateSimpleNotification('Replace failed', 'error');\n return null;\n } finally {\n this.IsUploading = false;\n this.cdr.markForCheck();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // UI Actions & Helpers\n // ────────────────────────────────────────────────────────────────────\n\n public ClosePanel(): void {\n this.PanelClosed.emit();\n }\n\n public ClosePreviewModal(): void {\n if (this.mediaLoadedTimer) {\n clearTimeout(this.mediaLoadedTimer);\n }\n this.PreviewModalOpen = false;\n this.IsLoadingPreview = false;\n this.IsMediaLoaded = false;\n this.ActivePreviewItem = null;\n this.ActivePreviewUrl = null;\n this.ActivePreviewSafeUrl = null;\n this.ActivePreviewTextContent = null;\n this.cdr.markForCheck();\n }\n\n public OpenEditMetadata(attachment: RecordAttachmentItem): void {\n this.EditMetadataItem = attachment;\n this.EditMetadataName = attachment.Name;\n this.EditMetadataDescription = attachment.Description || '';\n this.EditMetadataModalOpen = true;\n this.cdr.markForCheck();\n }\n\n public CloseEditMetadataModal(): void {\n this.EditMetadataModalOpen = false;\n this.EditMetadataItem = null;\n this.cdr.markForCheck();\n }\n\n public async SaveEditMetadata(): Promise<void> {\n if (!this.EditMetadataItem || !this.EditMetadataName.trim()) return;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const fileEntity: MJFileEntity = this.EditMetadataItem.FileEntity ?? (await md.GetEntityObject('MJ: Files'));\n if (!this.EditMetadataItem.FileEntity) {\n await fileEntity.Load(this.EditMetadataItem.FileID);\n }\n\n fileEntity.Name = this.EditMetadataName.trim();\n fileEntity.Description = this.EditMetadataDescription.trim() || null;\n\n const success = await fileEntity.Save();\n if (success) {\n this.EditMetadataItem.Name = fileEntity.Name;\n this.EditMetadataItem.Description = fileEntity.Description;\n this.notifications.CreateSimpleNotification('Attachment details updated', 'success');\n this.CloseEditMetadataModal();\n } else {\n this.notifications.CreateSimpleNotification('Failed to update attachment details', 'error');\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Save metadata error:', err);\n this.notifications.CreateSimpleNotification('Update failed', 'error');\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n public OnFilesSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n console.log('[RecordAttachmentsComponent] OnFilesSelected event fired, files count:', input.files?.length);\n if (input.files && input.files.length > 0) {\n const filesArray = Array.from(input.files);\n input.value = '';\n void this.UploadFiles(filesArray);\n }\n }\n\n public OnReplaceFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n console.log('[RecordAttachmentsComponent] OnReplaceFileSelected event fired, files count:', input.files?.length);\n if (input.files && input.files.length > 0 && this.pendingReplaceItem) {\n const file = input.files[0];\n const target = this.pendingReplaceItem;\n this.pendingReplaceItem = null;\n input.value = '';\n void this.ReplaceAttachment(target, file);\n }\n }\n\n public OnDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n public OnDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n console.log('[RecordAttachmentsComponent] OnDrop event fired, dataTransfer files count:', event.dataTransfer?.files?.length);\n if (event.dataTransfer?.files && event.dataTransfer.files.length > 0) {\n const filesArray = Array.from(event.dataTransfer.files);\n void this.UploadFiles(filesArray);\n }\n }\n\n public GetMediaType(attachment: RecordAttachmentItem): AttachmentMediaType {\n return GetAttachmentMediaType(attachment.ContentType, attachment.Name);\n }\n\n public FormatSize(bytes?: number | null): string {\n return FormatAttachmentFileSize(bytes);\n }\n\n public GetFileIcon(attachment: RecordAttachmentItem): string {\n const mediaType = this.GetMediaType(attachment);\n switch (mediaType) {\n case 'pdf':\n return 'fa-solid fa-file-pdf';\n case 'image':\n return 'fa-solid fa-file-image';\n case 'video':\n return 'fa-solid fa-file-video';\n case 'audio':\n return 'fa-solid fa-file-audio';\n case 'text':\n return 'fa-solid fa-file-code';\n case 'document':\n return 'fa-solid fa-file-word';\n default:\n return 'fa-solid fa-file';\n }\n }\n\n public GetFileColorClass(attachment: RecordAttachmentItem): string {\n const mediaType = this.GetMediaType(attachment);\n return `mj-attachment-thumb--${mediaType}`;\n }\n\n @HostListener('document:click')\n public OnDocumentClick(): void {\n this.CloseItemMenu();\n }\n\n @HostListener('document:keydown.escape')\n public OnEscapePress(): void {\n this.CloseItemMenu();\n }\n\n public ToggleItemMenu(event: MouseEvent, item: RecordAttachmentItem): void {\n event.stopPropagation();\n this.ActiveMenuLinkID = this.ActiveMenuLinkID === item.LinkID ? null : item.LinkID;\n this.cdr.markForCheck();\n }\n\n public CloseItemMenu(): void {\n if (this.ActiveMenuLinkID !== null) {\n this.ActiveMenuLinkID = null;\n this.cdr.markForCheck();\n }\n }\n\n public GetProviderIcon(item: RecordAttachmentItem): string {\n if (item.ProviderIconClass) {\n return item.ProviderIconClass;\n }\n const provider = item.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, item.ProviderID)) : null;\n const config = provider?.ConfigurationObject;\n if (config?.IconClass) {\n return config.IconClass;\n }\n return this.GetFallbackProviderIcon(item.ProviderName);\n }\n\n public GetProviderBrandColor(item: RecordAttachmentItem): string | undefined {\n if (item.ProviderBrandColor) {\n return item.ProviderBrandColor;\n }\n const provider = item.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, item.ProviderID)) : null;\n const config = provider?.ConfigurationObject;\n return config?.BrandColor || undefined;\n }\n\n public GetFallbackProviderIcon(providerName?: string | null): string {\n const name = (providerName || '').toLowerCase();\n if (name.includes('box')) return 'fa-solid fa-box';\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') || name.includes('gcs') || name.includes('google')) return 'fa-brands fa-google';\n if (name.includes('dropbox')) return 'fa-brands fa-dropbox';\n if (name.includes('sharepoint') || name.includes('onedrive')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-cloud';\n }\n\n private providerSupportsDirectUpload(provider?: MJFileStorageProviderEntity | null): boolean {\n if (!provider) return false;\n const key = (provider.ServerDriverKey || '').toLowerCase();\n const name = (provider.Name || '').toLowerCase();\n return (\n key.includes('aws') ||\n key.includes('azure') ||\n key.includes('google cloud') ||\n name.includes('aws') ||\n name.includes('s3') ||\n name.includes('azure') ||\n name.includes('google cloud')\n );\n }\n\n private triggerBrowserDownload(url: string, fileName: string): void {\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n link.parentNode?.removeChild(link);\n }\n\n /**\n * Performs an authenticated direct binary upload of a raw File/Blob to a pre-authenticated cloud storage URL.\n */\n private uploadBinaryDirect(\n uploadUrl: string,\n file: File,\n onProgress?: (loaded: number, total: number) => void\n ): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('PUT', uploadUrl, true);\n\n // Set standard content type\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n\n // For Azure Blob Storage SAS uploads, add the required block blob header\n if (uploadUrl.includes('.blob.core.windows.net')) {\n xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');\n }\n\n if (xhr.upload && onProgress) {\n xhr.upload.onprogress = (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded, event.total);\n }\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(true);\n } else {\n reject(new Error(`Direct binary upload failed with HTTP status ${xhr.status}: ${xhr.statusText}`));\n }\n };\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred during direct binary upload.'));\n };\n\n xhr.ontimeout = () => {\n reject(new Error('Direct binary upload timed out.'));\n };\n\n xhr.send(file);\n });\n }\n\n /**\n * Performs an authenticated raw binary streaming upload to the /media/upload-stage REST endpoint.\n * Uses the cryptographically signed media-upload token minted by CreateUploadStageToken.\n * Returns an ephemeral single-use upload token to pass to the GraphQL UploadStorageFile mutation.\n */\n private uploadBinaryStage(\n file: File,\n stageToken: string,\n onProgress?: (loaded: number, total: number) => void\n ): Promise<string> {\n return new Promise((resolve, reject) => {\n let uploadUrl = '/media/upload-stage';\n const gqlUrl = GraphQLDataProvider.Instance?.ConfigData?.URL;\n if (gqlUrl && gqlUrl.startsWith('http')) {\n uploadUrl = gqlUrl.replace(/\\/graphql\\/?$/i, '').replace(/\\/+$/, '') + '/media/upload-stage';\n }\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', uploadUrl, true);\n\n // Signed media-upload token\n xhr.setRequestHeader('Authorization', `Bearer ${stageToken}`);\n\n // Metadata headers\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n xhr.setRequestHeader('x-file-name', encodeURIComponent(file.name));\n\n if (xhr.upload && onProgress) {\n xhr.upload.onprogress = (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded, event.total);\n }\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const res = JSON.parse(xhr.responseText) as { Success?: boolean; UploadToken?: string; ErrorMessage?: string };\n if (res.Success && res.UploadToken) {\n resolve(res.UploadToken);\n } else {\n reject(new Error(res.ErrorMessage || 'Upload staging returned unsuccessful status'));\n }\n } catch {\n reject(new Error('Failed to parse upload staging response JSON'));\n }\n } else {\n let errorDetail = xhr.statusText;\n try {\n const errRes = JSON.parse(xhr.responseText) as { ErrorMessage?: string };\n if (errRes.ErrorMessage) {\n errorDetail = errRes.ErrorMessage;\n }\n } catch {\n // keep statusText\n }\n reject(new Error(`Upload staging failed with HTTP status ${xhr.status}: ${errorDetail}`));\n }\n };\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred during upload staging.'));\n };\n\n xhr.ontimeout = () => {\n reject(new Error('Upload staging timed out.'));\n };\n\n xhr.send(file);\n });\n }\n\n private fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result;\n if (typeof result === 'string') {\n const base64 = result.substring(result.indexOf(',') + 1);\n resolve(base64);\n } else {\n reject(new Error('Failed to read file as base64 string'));\n }\n };\n reader.onerror = (err) => reject(err);\n reader.readAsDataURL(file);\n });\n }\n}\n","<mj-slide-panel\n [Mode]=\"'slide'\"\n [Title]=\"Title\"\n [Visible]=\"Visible\"\n [Resizable]=\"Resizable\"\n [MinWidthPx]=\"MinWidthPx\"\n [MaxWidthRatio]=\"MaxWidthRatio\"\n [WidthPx]=\"WidthPx\"\n (Closed)=\"ClosePanel()\"\n (WidthChanged)=\"OnWidthChanged($event)\">\n\n <div class=\"mj-record-attachments-wrapper\">\n \n <!-- Top Meta Strip -->\n <div class=\"mj-record-attachments-meta-strip\">\n <div class=\"mj-record-attachments-summary\">\n <span class=\"mj-record-attachments-badge\">\n {{ Attachments.length }} {{ Attachments.length === 1 ? 'attachment' : 'attachments' }}\n @if (Attachments.length > 0) {\n • {{ TotalSizeFormatted }}\n }\n </span>\n </div>\n\n <div class=\"mj-record-attachments-top-actions\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"Refresh()\" [disabled]=\"IsLoading\" title=\"Refresh attachments\">\n <i class=\"fa-solid fa-rotate-right\" [class.fa-spin]=\"IsLoading\"></i>\n </button>\n </div>\n </div>\n\n <!-- Provider Filter Pills & View Toggle -->\n <div class=\"mj-record-attachments-controls-bar\">\n @if (ShowProviderFilter && ActiveProviders.length > 1) {\n <div class=\"mj-provider-pills\">\n <button type=\"button\" class=\"mj-provider-pill\" [class.active]=\"SelectedProviderFilter === 'all'\" (click)=\"SelectedProviderFilter = 'all'\">\n <span>All Providers</span>\n <span class=\"mj-pill-count\">({{ Attachments.length }})</span>\n </button>\n @for (provider of ActiveProviders; track provider.ID) {\n <button type=\"button\" class=\"mj-provider-pill\" [class.active]=\"SelectedProviderFilter === provider.ID\" (click)=\"SelectedProviderFilter = provider.ID\">\n <span>{{ provider.Name }}</span>\n <span class=\"mj-pill-count\">({{ GetProviderItemCount(provider.ID) }})</span>\n </button>\n }\n </div>\n }\n\n <div class=\"mj-view-controls\">\n <button type=\"button\" class=\"mj-view-toggle-btn\" [class.active]=\"ViewMode === 'grid'\" (click)=\"SetViewMode('grid')\" title=\"Card Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button type=\"button\" class=\"mj-view-toggle-btn\" [class.active]=\"ViewMode === 'list'\" (click)=\"SetViewMode('list')\" title=\"Detailed List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"mj-record-attachments-content\">\n \n @if (!IsLoading && StorageAccounts.length === 0) {\n <div class=\"mj-record-attachments-alert\">\n <mj-alert\n Type=\"warning\"\n Title=\"No Active Storage Providers Configured\"\n Message=\"No active file storage providers or accounts were found. Configure a storage provider (such as Azure Blob Storage, AWS S3, or Box) in the Storage Subsystem settings to enable uploading files.\">\n </mj-alert>\n </div>\n }\n\n <!-- Upload Progress Status Banner -->\n @if (IsUploading) {\n <div class=\"mj-upload-progress-banner\">\n <div class=\"mj-upload-progress-header\">\n <div class=\"mj-upload-progress-info\">\n <i class=\"fa-solid fa-cloud-arrow-up fa-bounce mj-upload-progress-icon\"></i>\n <span class=\"mj-upload-progress-text\">{{ UploadStatusText }}</span>\n </div>\n <span class=\"mj-upload-progress-pct\">{{ UploadProgressPercent }}%</span>\n </div>\n <div class=\"mj-upload-progress-track\">\n <div class=\"mj-upload-progress-bar\" [style.width.%]=\"UploadProgressPercent\"></div>\n </div>\n </div>\n }\n\n <!-- Drag & Drop Upload Zone -->\n @if (EffectiveAllowUpload) {\n <div class=\"mj-upload-dropzone\" [class.disabled]=\"IsUploading\" (dragover)=\"OnDragOver($event)\" (drop)=\"OnDrop($event)\" (click)=\"!IsUploading && fileInputRef.click()\">\n <i class=\"fa-solid fa-cloud-arrow-up mj-upload-dropzone-icon\"></i>\n <div class=\"mj-upload-dropzone-title\">\n Drop files to attach, or <span class=\"mj-upload-dropzone-link\">Browse</span>\n </div>\n <div class=\"mj-upload-dropzone-subtitle\">\n Direct secure storage upload • Max {{ Config?.MaxFileSizeBytes ? FormatSize(Config?.MaxFileSizeBytes) : '50 MB' }}\n </div>\n\n @if (StorageAccounts.length > 1) {\n <div class=\"mj-upload-storage-row\" (click)=\"$event.stopPropagation()\">\n <span>Target storage:</span>\n <select class=\"mj-upload-storage-select\" [(ngModel)]=\"SelectedStorageAccountID\" [disabled]=\"IsUploading\">\n @for (sa of StorageAccounts; track sa.account.ID) {\n <option [value]=\"sa.account.ID\">{{ sa.account.Name }} ({{ sa.provider.Name }})</option>\n }\n </select>\n </div>\n }\n <input type=\"file\" #fileInputRef multiple style=\"display: none;\" (change)=\"OnFilesSelected($event)\" />\n </div>\n }\n\n <!-- Search Filter -->\n @if (ShowSearch && Attachments.length > 0) {\n <div class=\"mj-attachments-search-bar\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input type=\"text\" [(ngModel)]=\"SearchTerm\" placeholder=\"Filter attachments by name, category, extension...\" />\n @if (SearchTerm) {\n <button type=\"button\" class=\"mj-clear-search-btn\" (click)=\"SearchTerm = ''\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Hidden Input for Replace Action -->\n <input type=\"file\" #replaceInputRef style=\"display: none;\" (change)=\"OnReplaceFileSelected($event)\" />\n\n <!-- Attachments List / Grid -->\n @if (IsLoading) {\n <div class=\"mj-record-attachments-loading\">\n <mj-loading text=\"Loading attachments...\"></mj-loading>\n </div>\n } @else if (FilteredAttachments.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-paperclip\"\n [Title]=\"SearchTerm ? 'No matching attachments' : 'No attachments yet'\"\n [Message]=\"SearchTerm ? 'Try adjusting your search query or provider filter.' : (StorageAccounts.length === 0 ? 'No active file storage accounts are configured. Uploads are disabled until a storage account is configured.' : (EffectiveAllowUpload ? 'Upload or drop files above to link attachments to this record.' : 'No attachments are linked to this record.'))\">\n </mj-empty-state>\n } @else {\n <div class=\"mj-attachments-container\" [class.mj-attachments-grid-mode]=\"ViewMode === 'grid'\">\n @for (item of FilteredAttachments; track item.LinkID) {\n <div class=\"mj-attachment-card\" [class.mj-attachment-card--list]=\"ViewMode === 'list'\">\n <div class=\"mj-attachment-card-top\" (click)=\"AllowPreview ? PreviewAttachment(item) : OpenAttachmentRecord(item)\">\n <div class=\"mj-attachment-thumb\" [ngClass]=\"GetFileColorClass(item)\" [title]=\"'Preview ' + item.Name\">\n <i [class]=\"GetFileIcon(item)\"></i>\n </div>\n <div class=\"mj-attachment-info\">\n <div class=\"mj-attachment-name\" [title]=\"item.Name\">\n {{ item.Name }}\n </div>\n <div class=\"mj-attachment-meta\">\n @if (item.FileSize) {\n <span>{{ FormatSize(item.FileSize) }}</span>\n <span>•</span>\n }\n @if (item.CategoryName) {\n <span class=\"mj-attachment-cat-badge\">{{ item.CategoryName }}</span>\n <span>•</span>\n }\n <span>{{ item.ContentType || 'File' }}</span>\n </div>\n @if (item.ProviderName) {\n <div class=\"mj-attachment-provider-tag\" [style.--provider-color]=\"GetProviderBrandColor(item)\">\n <i [class]=\"GetProviderIcon(item)\"></i>\n <span>{{ item.ProviderName }}</span>\n </div>\n }\n @if (item.Description) {\n <div class=\"mj-attachment-description\" [title]=\"item.Description\">\n {{ item.Description }}\n </div>\n }\n </div>\n </div>\n\n <!-- Streamlined Action Toolbar (Preview + Download + Overflow Menu) -->\n <div class=\"mj-attachment-actions\" (click)=\"$event.stopPropagation()\">\n @if (AllowPreview) {\n <button type=\"button\" class=\"mj-attachment-action-btn\" (click)=\"PreviewAttachment(item)\" title=\"Quick preview\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n }\n @if (AllowDownload) {\n <button type=\"button\" class=\"mj-attachment-action-btn\" (click)=\"DownloadAttachment(item)\" title=\"Download file\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n }\n\n <!-- Overflow Menu Trigger -->\n <div class=\"mj-attachment-menu-container\">\n <button\n type=\"button\"\n class=\"mj-attachment-action-btn mj-attachment-action-btn--more\"\n [class.mj-attachment-action-btn--active]=\"ActiveMenuLinkID === item.LinkID\"\n (click)=\"ToggleItemMenu($event, item)\"\n title=\"More actions\"\n [attr.aria-expanded]=\"ActiveMenuLinkID === item.LinkID\"\n >\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n\n <!-- Dropdown Menu -->\n @if (ActiveMenuLinkID === item.LinkID) {\n <div class=\"mj-attachment-dropdown\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"OpenAttachmentRecord(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n <span>Open in Workspace</span>\n </button>\n @if (AllowEditMetadata && UserCanUpdateFile) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"OpenEditMetadata(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-pen\"></i>\n <span>Edit Details</span>\n </button>\n }\n @if (AllowReplace && EffectiveAllowUpload) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"RequestReplace(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-arrow-right-arrow-left\"></i>\n <span>Replace File</span>\n </button>\n }\n @if (EffectiveAllowUnlink || EffectiveAllowDelete) {\n <div class=\"mj-attachment-dropdown-divider\"></div>\n }\n @if (EffectiveAllowUnlink) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item mj-attachment-dropdown-item--warning\" (click)=\"UnlinkAttachment(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-link-slash\"></i>\n <span>Unlink from Record</span>\n </button>\n }\n @if (EffectiveAllowDelete) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item mj-attachment-dropdown-item--danger\" (click)=\"DeleteAttachment(item, true); CloseItemMenu()\">\n <i class=\"fa-regular fa-trash-can\"></i>\n <span>Delete Completely</span>\n </button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n\n <!-- ====================================================================\n EDIT ATTACHMENT DETAILS SUB-PANEL (Slide-in inside slide-panel)\n ==================================================================== -->\n @if (EditMetadataModalOpen && EditMetadataItem) {\n <div class=\"mj-record-attachments-subpanel\">\n <!-- Sub-Panel Top Navigation Bar -->\n <div class=\"mj-subpanel-header\">\n <button type=\"button\" class=\"mj-subpanel-back-btn\" (click)=\"CloseEditMetadataModal()\" title=\"Back to attachments\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n <span>Back</span>\n </button>\n <div class=\"mj-subpanel-title\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span>Attachment Details</span>\n </div>\n <button type=\"button\" class=\"mj-subpanel-close-btn\" (click)=\"CloseEditMetadataModal()\" title=\"Close details\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Sub-Panel Body -->\n <div class=\"mj-subpanel-body\">\n <!-- File Info Summary Hero -->\n <div class=\"mj-subpanel-hero\">\n <div class=\"mj-subpanel-icon\" [ngClass]=\"GetFileColorClass(EditMetadataItem)\">\n <i [class]=\"GetFileIcon(EditMetadataItem)\"></i>\n </div>\n <div class=\"mj-subpanel-hero-info\">\n <div class=\"mj-subpanel-hero-name\" [title]=\"EditMetadataItem.Name\">{{ EditMetadataItem.Name }}</div>\n <div class=\"mj-subpanel-hero-meta\">\n <span>{{ FormatSize(EditMetadataItem.FileSize) }}</span>\n <span class=\"mj-subpanel-dot\">•</span>\n <span>{{ EditMetadataItem.ContentType || 'Document' }}</span>\n @if (EditMetadataItem.ProviderName) {\n <span class=\"mj-subpanel-dot\">•</span>\n <span class=\"mj-subpanel-storage-tag\">{{ EditMetadataItem.ProviderName }}</span>\n }\n </div>\n </div>\n </div>\n\n <!-- Edit Form -->\n <div class=\"mj-subpanel-form\">\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">File Name</label>\n <input\n type=\"text\"\n class=\"mj-form-input\"\n [(ngModel)]=\"EditMetadataName\"\n placeholder=\"e.g. document.pdf\"\n (keydown.enter)=\"EditMetadataName.trim() && !IsLoading && SaveEditMetadata()\"\n />\n <div class=\"mj-form-hint\">Changing the name updates the display title across all record views.</div>\n </div>\n\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Description (Optional)</label>\n <textarea\n class=\"mj-form-textarea\"\n [(ngModel)]=\"EditMetadataDescription\"\n rows=\"4\"\n placeholder=\"Add notes, tags, or context about this attachment...\"\n ></textarea>\n </div>\n\n <!-- Metadata Properties Card -->\n <div class=\"mj-subpanel-details-card\">\n <div class=\"mj-details-card-title\">Storage Information</div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Storage Account:</span>\n <span class=\"mj-details-value\">{{ EditMetadataItem.ProviderName || 'Default Storage' }}</span>\n </div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Attached On:</span>\n <span class=\"mj-details-value\">{{ EditMetadataItem.CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Status:</span>\n <span class=\"mj-details-badge\">{{ EditMetadataItem.Status || 'Active' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Sub-Panel Footer Actions -->\n <div class=\"mj-subpanel-footer\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"CloseEditMetadataModal()\">\n Cancel\n </button>\n <div class=\"mj-subpanel-footer-right\">\n @if (AllowDownload) {\n <button\n type=\"button\"\n class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-secondary\"\n (click)=\"DownloadAttachment(EditMetadataItem)\"\n title=\"Open in new tab\"\n >\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n <span>Open</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-primary\"\n (click)=\"SaveEditMetadata()\"\n [disabled]=\"!EditMetadataName.trim() || IsLoading\"\n >\n <i class=\"fa-solid fa-check\"></i>\n <span>{{ IsLoading ? 'Saving...' : 'Save Changes' }}</span>\n </button>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n</mj-slide-panel>\n\n<!-- ====================================================================\n RICH MEDIA PREVIEW MODAL\n ==================================================================== -->\n@if (PreviewModalOpen && ActivePreviewItem) {\n <div class=\"mj-preview-modal-backdrop\" (click)=\"ClosePreviewModal()\">\n <div class=\"mj-preview-dialog\" (click)=\"$event.stopPropagation()\">\n \n <div class=\"mj-preview-dialog-header\">\n <div class=\"mj-preview-dialog-title\">\n <i [class]=\"GetFileIcon(ActivePreviewItem)\" [ngClass]=\"GetFileColorClass(ActivePreviewItem)\"></i>\n <span>{{ ActivePreviewItem.Name }}</span>\n </div>\n <button type=\"button\" class=\"mj-preview-close-btn\" (click)=\"ClosePreviewModal()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"mj-preview-dialog-body\">\n @if (IsLoadingPreview || !IsMediaLoaded) {\n <div class=\"mj-preview-loading-overlay\">\n <mj-loading [text]=\"'Loading ' + (ActivePreviewItem.Name || 'preview') + '...'\"></mj-loading>\n </div>\n }\n\n @switch (GetMediaType(ActivePreviewItem)) {\n @case ('image') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-image-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <img [src]=\"ActivePreviewUrl\" [alt]=\"ActivePreviewItem.Name\" (load)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\" />\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-image mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Preview could not be loaded</div>\n </div>\n }\n }\n @case ('pdf') {\n @if (ActivePreviewSafeUrl) {\n <div class=\"mj-preview-frame-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <iframe [src]=\"ActivePreviewSafeUrl\" title=\"PDF Preview\" (load)=\"OnPreviewMediaLoaded()\"></iframe>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-pdf mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">PDF preview could not be loaded</div>\n </div>\n }\n }\n @case ('video') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-media-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <video controls autoplay [src]=\"ActivePreviewUrl\" (loadeddata)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\"></video>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-video mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Video preview could not be loaded</div>\n </div>\n }\n }\n @case ('audio') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-media-container mj-preview-audio-box\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <div class=\"mj-preview-audio-icon\"><i class=\"fa-solid fa-headphones\"></i></div>\n <audio controls [src]=\"ActivePreviewUrl\" (loadeddata)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\"></audio>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-audio mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Audio preview could not be loaded</div>\n </div>\n }\n }\n @case ('text') {\n <div class=\"mj-preview-text-container\">\n <pre><code>{{ ActivePreviewTextContent || 'Loading content...' }}</code></pre>\n </div>\n }\n @default {\n <div class=\"mj-preview-generic-box\">\n <i [class]=\"GetFileIcon(ActivePreviewItem)\" class=\"mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">{{ ActivePreviewItem.ContentType || 'Document' }} • {{ FormatSize(ActivePreviewItem.FileSize) }}</div>\n <div class=\"mj-preview-generic-desc\">{{ ActivePreviewItem.Description || 'Preview not available for this binary file format.' }}</div>\n </div>\n }\n }\n </div>\n\n <div class=\"mj-preview-dialog-footer\">\n <div class=\"mj-preview-footer-meta\">\n @if (ActivePreviewItem.ProviderName) {\n <span>Storage: <strong>{{ ActivePreviewItem.ProviderName }}</strong></span>\n }\n </div>\n <div class=\"mj-preview-footer-actions\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"ClosePreviewModal()\">Close</button>\n @if (AllowDownload) {\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-primary\" (click)=\"DownloadAttachment(ActivePreviewItem)\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download</span>\n </button>\n }\n </div>\n </div>\n\n </div>\n </div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"record-attachments.component.js","sourceRoot":"","sources":["../../../src/lib/record-attachments/record-attachments.component.ts","../../../src/lib/record-attachments/record-attachments.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ChangeDetectorRef,\n inject,\n ViewChild,\n ElementRef,\n HostListener,\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { BaseEntity, RunView, CompositeKey } from '@memberjunction/core';\nimport {\n MJFileEntity,\n MJFileEntityRecordLinkEntity,\n MJFileStorageProviderEntity,\n MJFileStorageAccountEntity,\n FileStorageEngineBase,\n StorageAccountWithProvider,\n UserInfoEngine,\n} from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, gql } from '@memberjunction/graphql-dataprovider';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { NavigationService, SharedService } from '@memberjunction/ng-shared';\nimport { UUIDsEqual, NormalizeUUID } from '@memberjunction/global';\nimport { z } from 'zod';\nimport {\n RecordAttachmentItem,\n RecordAttachmentsConfig,\n AttachmentViewMode,\n AttachmentMediaType,\n GetAttachmentMediaType,\n FormatAttachmentFileSize,\n} from './record-attachments.types';\nimport {\n BeforeUploadAttachmentEventArgs,\n AfterUploadAttachmentEventArgs,\n BeforeDeleteAttachmentEventArgs,\n AfterDeleteAttachmentEventArgs,\n BeforeUnlinkAttachmentEventArgs,\n AfterUnlinkAttachmentEventArgs,\n BeforeDownloadAttachmentEventArgs,\n AfterDownloadAttachmentEventArgs,\n BeforePreviewAttachmentEventArgs,\n AfterPreviewAttachmentEventArgs,\n BeforeReplaceAttachmentEventArgs,\n AfterReplaceAttachmentEventArgs,\n} from './record-attachments.events';\n\nconst FileFieldsFragment = gql`\n fragment FileFields on MJFile_ {\n Category\n CategoryID\n ContentType\n _mj__CreatedAt\n Description\n ID\n Name\n Provider\n ProviderID\n ProviderKey\n Status\n _mj__UpdatedAt\n }\n`;\n\nconst UploadStorageFileMutation = gql`\n mutation UploadStorageFile($input: UploadStorageFileInput!) {\n UploadStorageFile(input: $input) {\n Success\n FileID\n ErrorMessage\n File {\n Category\n CategoryID\n ContentType\n _mj__CreatedAt\n Description\n ID\n Name\n Provider\n ProviderID\n ProviderKey\n Status\n _mj__UpdatedAt\n }\n }\n }\n`;\n\nconst UploadStorageFileMutationSchema = z.object({\n UploadStorageFile: z.object({\n Success: z.boolean(),\n FileID: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n File: z.object({\n ID: z.string(),\n Name: z.string().optional().nullable(),\n ProviderID: z.string().optional().nullable(),\n Provider: z.string().optional().nullable(),\n ContentType: z.string().optional().nullable(),\n Description: z.string().optional().nullable(),\n Status: z.string().optional().nullable(),\n CategoryID: z.string().optional().nullable(),\n Category: z.string().optional().nullable(),\n }).passthrough().optional().nullable(),\n }),\n});\n\nconst CreateUploadStageTokenMutation = `\n mutation CreateUploadStageToken {\n CreateUploadStageToken {\n Success\n Token\n Url\n ErrorMessage\n }\n }\n`;\n\nconst CreateUploadStageTokenMutationSchema = z.object({\n CreateUploadStageToken: z.object({\n Success: z.boolean(),\n Token: z.string().optional().nullable(),\n Url: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n }),\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().nullable(),\n DownloadUrl: z.string(),\n }),\n});\n\nconst CreateMediaAccessTokenMutation = gql`\n mutation CreateMediaAccessToken($fileId: String!) {\n CreateMediaAccessToken(fileId: $fileId) {\n Success\n Token\n Url\n MimeType\n ErrorMessage\n }\n }\n`;\n\nconst CreateMediaAccessTokenMutationSchema = z.object({\n CreateMediaAccessToken: z.object({\n Success: z.boolean(),\n Token: z.string().optional().nullable(),\n Url: z.string().optional().nullable(),\n MimeType: z.string().optional().nullable(),\n ErrorMessage: z.string().optional().nullable(),\n }),\n});\n\nconst CreatePreAuthUploadUrlMutation = gql`\n mutation CreatePreAuthUploadUrl($input: CreatePreAuthUploadUrlInput!) {\n CreatePreAuthUploadUrl(input: $input) {\n UploadUrl\n ProviderKey\n }\n }\n`;\n\nconst CreatePreAuthUploadUrlMutationSchema = z.object({\n CreatePreAuthUploadUrl: z.object({\n UploadUrl: z.string().optional().nullable(),\n ProviderKey: z.string().optional().nullable(),\n }),\n});\n\n/**\n * World-class Angular component for displaying, previewing, uploading,\n * and managing file attachments linked to an entity record.\n *\n * Selector: `mj-record-attachments`\n */\n@Component({\n standalone: false,\n selector: 'mj-record-attachments',\n templateUrl: './record-attachments.component.html',\n styleUrls: ['./record-attachments.component.css'],\n})\nexport class RecordAttachmentsComponent extends BaseAngularComponent implements OnInit, OnChanges {\n private cdr = inject(ChangeDetectorRef);\n private notifications = inject(MJNotificationService);\n private sanitizer = inject(DomSanitizer);\n\n private static readonly PREF_WIDTH_KEY = 'mj.recordAttachments.width';\n private static readonly PREF_VIEW_MODE_KEY = 'mj.recordAttachments.viewMode';\n\n // ────────────────────────────────────────────────────────────────────\n // Inputs\n // ────────────────────────────────────────────────────────────────────\n\n /** Entity record to load attachments for */\n @Input() Record?: BaseEntity;\n\n /** Explicit EntityID (alternative to passing Record) */\n @Input() EntityID?: string;\n\n /** Explicit RecordID (alternative to passing Record) */\n @Input() RecordID?: string;\n\n /** Bound attachment items (supports direct data-binding / manipulation) */\n @Input() Attachments: RecordAttachmentItem[] = [];\n\n /** Attachment configuration bag */\n @Input() Config?: RecordAttachmentsConfig;\n\n /** Whether the slide panel is visible */\n @Input() Visible: boolean = true;\n\n /** Whether the slide panel is resizable */\n @Input() Resizable: boolean = true;\n\n /** Initial width in px. 0 = auto/persisted setting */\n @Input() WidthPx: number = 0;\n\n /** Minimum panel width in px */\n @Input() MinWidthPx: number = 420;\n\n /** Maximum panel width ratio of viewport */\n @Input() MaxWidthRatio: number = 0.65;\n\n /** Panel title */\n @Input() Title: string = 'Attachments';\n\n /** Permissions / Feature flags */\n @Input() AllowUpload: boolean = true;\n @Input() AllowDelete: boolean = true;\n @Input() AllowUnlink: boolean = true;\n @Input() AllowDownload: boolean = true;\n @Input() AllowPreview: boolean = true;\n @Input() AllowReplace: boolean = true;\n @Input() AllowEditMetadata: boolean = true;\n\n /** UI Controls */\n @Input() ShowProviderFilter: boolean = true;\n @Input() ShowSearch: boolean = true;\n @Input() ViewMode: AttachmentViewMode = 'grid';\n\n // ────────────────────────────────────────────────────────────────────\n // Outputs / Events\n // ────────────────────────────────────────────────────────────────────\n\n @Output() PanelClosed = new EventEmitter<void>();\n @Output() WidthChanged = new EventEmitter<number>();\n @Output() AttachmentCountChanged = new EventEmitter<number>();\n @Output() ViewModeChanged = new EventEmitter<AttachmentViewMode>();\n\n @Output() BeforeUpload = new EventEmitter<BeforeUploadAttachmentEventArgs>();\n @Output() AfterUpload = new EventEmitter<AfterUploadAttachmentEventArgs>();\n\n @Output() BeforeDelete = new EventEmitter<BeforeDeleteAttachmentEventArgs>();\n @Output() AfterDelete = new EventEmitter<AfterDeleteAttachmentEventArgs>();\n\n @Output() BeforeUnlink = new EventEmitter<BeforeUnlinkAttachmentEventArgs>();\n @Output() AfterUnlink = new EventEmitter<AfterUnlinkAttachmentEventArgs>();\n\n @Output() BeforeDownload = new EventEmitter<BeforeDownloadAttachmentEventArgs>();\n @Output() AfterDownload = new EventEmitter<AfterDownloadAttachmentEventArgs>();\n\n @Output() BeforePreview = new EventEmitter<BeforePreviewAttachmentEventArgs>();\n @Output() AfterPreview = new EventEmitter<AfterPreviewAttachmentEventArgs>();\n\n @Output() BeforeReplace = new EventEmitter<BeforeReplaceAttachmentEventArgs>();\n @Output() AfterReplace = new EventEmitter<AfterReplaceAttachmentEventArgs>();\n\n // ────────────────────────────────────────────────────────────────────\n // Internal State\n // ────────────────────────────────────────────────────────────────────\n\n @ViewChild('fileInputRef') FileInputRef?: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link FileInputRef}. */\n get fileInputRef(): ElementRef<HTMLInputElement> | undefined {\n return this.FileInputRef;\n }\n /** @deprecated Use {@link FileInputRef}. */\n set fileInputRef(value: ElementRef<HTMLInputElement> | undefined) {\n this.FileInputRef = value;\n }\n @ViewChild('replaceInputRef') ReplaceInputRef?: ElementRef<HTMLInputElement>;\n\n /** @deprecated Use {@link ReplaceInputRef}. */\n get replaceInputRef(): ElementRef<HTMLInputElement> | undefined {\n return this.ReplaceInputRef;\n }\n /** @deprecated Use {@link ReplaceInputRef}. */\n set replaceInputRef(value: ElementRef<HTMLInputElement> | undefined) {\n this.ReplaceInputRef = value;\n }\n\n public IsLoading: boolean = false;\n public IsUploading: boolean = false;\n public UploadProgressPercent: number = 0;\n public UploadStatusText: string = '';\n public UploadingFileName: string = '';\n public SearchTerm: string = '';\n public SelectedProviderFilter: string = 'all'; // 'all' or ProviderID\n\n public StorageAccounts: StorageAccountWithProvider[] = [];\n public ActiveProviders: MJFileStorageProviderEntity[] = [];\n public SelectedStorageAccountID: string = '';\n\n /** User Permissions */\n public UserCanCreateFile: boolean = true;\n public UserCanDeleteFile: boolean = true;\n public UserCanUpdateFile: boolean = true;\n public UserCanCreateLink: boolean = true;\n public UserCanDeleteLink: boolean = true;\n\n /** Active Preview State */\n public PreviewModalOpen: boolean = false;\n public IsLoadingPreview: boolean = false;\n public IsMediaLoaded: boolean = false;\n public ActivePreviewItem: RecordAttachmentItem | null = null;\n public ActivePreviewUrl: string | null = null;\n public ActivePreviewSafeUrl: SafeResourceUrl | null = null;\n public ActivePreviewTextContent: string | null = null;\n\n /** Replace Target */\n private pendingReplaceItem: RecordAttachmentItem | null = null;\n private navigationService = inject(NavigationService, { optional: true });\n private mediaLoadedTimer?: ReturnType<typeof setTimeout>;\n\n /** Edit Metadata Dialog */\n public EditMetadataModalOpen: boolean = false;\n public EditMetadataItem: RecordAttachmentItem | null = null;\n public EditMetadataName: string = '';\n public EditMetadataDescription: string = '';\n\n /** Active Overflow Menu */\n public ActiveMenuLinkID: string | null = null;\n\n // ────────────────────────────────────────────────────────────────────\n // Lifecycle\n // ────────────────────────────────────────────────────────────────────\n\n async ngOnInit(): Promise<void> {\n this.restoreUserPreferences();\n await this.checkStorageAndPermissions();\n if (this.Attachments.length === 0 && (this.Record || (this.EntityID && this.RecordID))) {\n await this.Refresh();\n }\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if (changes['Record'] || changes['EntityID'] || changes['RecordID']) {\n if (!changes['Record']?.firstChange && !changes['EntityID']?.firstChange && !changes['RecordID']?.firstChange) {\n await this.Refresh();\n }\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Preferences & Permissions\n // ────────────────────────────────────────────────────────────────────\n\n private restoreUserPreferences(): void {\n const savedWidth = UserInfoEngine.Instance.GetSetting(RecordAttachmentsComponent.PREF_WIDTH_KEY);\n if (savedWidth && !this.WidthPx) {\n this.WidthPx = parseInt(savedWidth, 10) || 520;\n } else if (!this.WidthPx) {\n this.WidthPx = 520;\n }\n\n const savedMode = UserInfoEngine.Instance.GetSetting(RecordAttachmentsComponent.PREF_VIEW_MODE_KEY);\n if (savedMode === 'grid' || savedMode === 'list') {\n this.ViewMode = savedMode;\n }\n }\n\n public OnWidthChanged(width: number): void {\n this.WidthPx = width;\n UserInfoEngine.Instance.SetSettingDebounced(RecordAttachmentsComponent.PREF_WIDTH_KEY, String(width));\n this.WidthChanged.emit(width);\n }\n\n public SetViewMode(mode: AttachmentViewMode): void {\n this.ViewMode = mode;\n UserInfoEngine.Instance.SetSettingDebounced(RecordAttachmentsComponent.PREF_VIEW_MODE_KEY, mode);\n this.ViewModeChanged.emit(mode);\n this.cdr.markForCheck();\n }\n\n private async checkStorageAndPermissions(): Promise<void> {\n try {\n await FileStorageEngineBase.Instance.Config(false);\n this.ActiveProviders = FileStorageEngineBase.Instance.Providers.filter((p) => p.IsActive !== false);\n this.StorageAccounts = FileStorageEngineBase.Instance.AccountsWithProviders.filter((ap) => ap.provider.IsActive !== false);\n\n // If initial cached check returns 0 accounts, force refresh from server in case cache was cold or stale\n if (this.StorageAccounts.length === 0) {\n await FileStorageEngineBase.Instance.Config(true);\n this.ActiveProviders = FileStorageEngineBase.Instance.Providers.filter((p) => p.IsActive !== false);\n this.StorageAccounts = FileStorageEngineBase.Instance.AccountsWithProviders.filter((ap) => ap.provider.IsActive !== false);\n }\n\n if (this.StorageAccounts.length > 0) {\n const preferredId = this.Config?.DefaultStorageAccountID;\n const matching = this.StorageAccounts.find((sa) => UUIDsEqual(sa.account.ID, preferredId));\n this.SelectedStorageAccountID = matching ? matching.account.ID : this.StorageAccounts[0].account.ID;\n }\n\n // Check Entity Permissions\n const md = this.ProviderToUse;\n const fileEntity = md.Entities.find((e) => e.Name === 'MJ: Files');\n const linkEntity = md.Entities.find((e) => e.Name === 'MJ: File Entity Record Links');\n const user = md.CurrentUser;\n\n if (fileEntity && user) {\n const perm = fileEntity.GetUserPermisions(user);\n this.UserCanCreateFile = perm.CanCreate;\n this.UserCanDeleteFile = perm.CanDelete;\n this.UserCanUpdateFile = perm.CanUpdate;\n }\n if (linkEntity && user) {\n const perm = linkEntity.GetUserPermisions(user);\n this.UserCanCreateLink = perm.CanCreate;\n this.UserCanDeleteLink = perm.CanDelete;\n }\n } catch (err) {\n console.warn('[RecordAttachmentsComponent] Storage check error:', err);\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Effective IDs\n // ────────────────────────────────────────────────────────────────────\n\n public get EffectiveEntityID(): string | null {\n if (this.Record?.EntityInfo?.ID) return this.Record.EntityInfo.ID;\n return this.EntityID ?? null;\n }\n\n public get EffectiveRecordID(): string | null {\n if (this.Record) {\n if (this.Record.PrimaryKey?.KeyValuePairs?.length > 0) {\n const val = this.Record.PrimaryKey.KeyValuePairs[0].Value;\n if (val !== null && val !== undefined && String(val).length > 0) return String(val);\n }\n const pkVal = this.Record.PrimaryKey?.GetValueByIndex(0);\n if (pkVal !== null && pkVal !== undefined && String(pkVal).length > 0) return String(pkVal);\n if ('ID' in this.Record && (this.Record as unknown as { ID: string }).ID) {\n return String((this.Record as unknown as { ID: string }).ID);\n }\n }\n return this.RecordID ?? null;\n }\n\n public get EffectiveAllowUpload(): boolean {\n return this.AllowUpload && this.UserCanCreateFile && this.UserCanCreateLink && this.StorageAccounts.length > 0;\n }\n\n public get EffectiveAllowDelete(): boolean {\n return this.AllowDelete && this.UserCanDeleteFile && this.UserCanDeleteLink;\n }\n\n public get EffectiveAllowUnlink(): boolean {\n return this.AllowUnlink && this.UserCanDeleteLink;\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Filtering & Computed Lists\n // ────────────────────────────────────────────────────────────────────\n\n public get FilteredAttachments(): RecordAttachmentItem[] {\n const term = (this.SearchTerm || '').toLowerCase().trim();\n const provider = this.SelectedProviderFilter;\n\n return this.Attachments.filter((item) => {\n const matchesProvider =\n provider === 'all' ||\n UUIDsEqual(item.ProviderID, provider) ||\n UUIDsEqual(item.StorageAccountID, provider);\n\n const matchesSearch =\n !term ||\n item.Name.toLowerCase().includes(term) ||\n (item.Description && item.Description.toLowerCase().includes(term)) ||\n (item.CategoryName && item.CategoryName.toLowerCase().includes(term)) ||\n (item.ContentType && item.ContentType.toLowerCase().includes(term));\n\n return matchesProvider && matchesSearch;\n });\n }\n\n public get ProviderCounts(): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of this.Attachments) {\n const pid = item.ProviderID || 'unknown';\n counts.set(pid, (counts.get(pid) ?? 0) + 1);\n }\n return counts;\n }\n\n public GetProviderItemCount(providerId: string): number {\n return this.ProviderCounts.get(providerId) ?? 0;\n }\n\n public get TotalSizeFormatted(): string {\n const totalBytes = this.Attachments.reduce((acc, curr) => acc + (curr.FileSize ?? 0), 0);\n return FormatAttachmentFileSize(totalBytes);\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Public Verbs / Methods\n // ────────────────────────────────────────────────────────────────────\n\n /**\n * Refreshes the linked attachments list by querying `MJ: File Entity Record Links` and `MJ: Files`.\n */\n public async Refresh(): Promise<void> {\n const entityId = this.EffectiveEntityID;\n const recordId = this.EffectiveRecordID;\n\n if (!entityId || !recordId) {\n return;\n }\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n await this.checkStorageAndPermissions();\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const linksResult = await rv.RunView<MJFileEntityRecordLinkEntity>({\n EntityName: 'MJ: File Entity Record Links',\n ExtraFilter: `EntityID='${entityId}' AND RecordID='${recordId}'`,\n ResultType: 'entity_object',\n });\n\n if (!linksResult.Success || !linksResult.Results) {\n this.Attachments = [];\n this.AttachmentCountChanged.emit(0);\n return;\n }\n\n const fileIds = linksResult.Results.map((link) => link.FileID).filter((id): id is string => !!id);\n\n if (fileIds.length === 0) {\n this.Attachments = [];\n this.AttachmentCountChanged.emit(0);\n return;\n }\n\n // Batch load files\n const fileFilter = fileIds.map((id) => `ID='${id}'`).join(' OR ');\n const filesResult = await rv.RunView<MJFileEntity>({\n EntityName: 'MJ: Files',\n ExtraFilter: fileFilter,\n ResultType: 'entity_object',\n });\n\n const filesMap = new Map<string, MJFileEntity>();\n if (filesResult.Success && filesResult.Results) {\n for (const file of filesResult.Results) {\n filesMap.set(NormalizeUUID(file.ID), file);\n }\n }\n\n // Map to RecordAttachmentItem\n this.Attachments = linksResult.Results.map((link) => {\n const file = link.FileID ? filesMap.get(NormalizeUUID(link.FileID)) : undefined;\n const provider = file?.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, file.ProviderID)) : undefined;\n const config = provider?.ConfigurationObject;\n return {\n LinkID: link.ID,\n FileID: link.FileID,\n Name: file?.Name ?? 'Untitled File',\n Description: file?.Description,\n ContentType: file?.ContentType,\n Status: file?.Status,\n ProviderName: file?.Provider,\n ProviderID: file?.ProviderID,\n ProviderIconClass: config?.IconClass || this.GetFallbackProviderIcon(file?.Provider),\n ProviderBrandColor: config?.BrandColor || undefined,\n CategoryID: file?.CategoryID,\n CategoryName: file?.Category,\n CreatedAt: file?.__mj_CreatedAt ? new Date(file.__mj_CreatedAt) : link.__mj_CreatedAt ? new Date(link.__mj_CreatedAt) : null,\n UpdatedAt: file?.__mj_UpdatedAt ? new Date(file.__mj_UpdatedAt) : null,\n FileEntity: file,\n LinkEntity: link,\n };\n });\n\n this.AttachmentCountChanged.emit(this.Attachments.length);\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Refresh error:', err);\n this.notifications.CreateSimpleNotification('Failed to load attachments', 'error');\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Uploads one or more files and links them to the active record.\n */\n public async UploadFiles(files: File[], storageAccountId?: string, categoryId?: string): Promise<RecordAttachmentItem[]> {\n console.log('[RecordAttachmentsComponent] UploadFiles called with', files.length, 'file(s):', files.map(f => ({ name: f.name, size: f.size, type: f.type })));\n\n if (!files || files.length === 0) return [];\n\n const entityId = this.EffectiveEntityID;\n const recordId = this.EffectiveRecordID;\n\n console.log('[RecordAttachmentsComponent] Resolved upload context:', {\n entityId,\n recordId,\n recordName: this.Record?.EntityInfo?.Name,\n explicitEntityID: this.EntityID,\n explicitRecordID: this.RecordID,\n storageAccountsAvailable: this.StorageAccounts.length,\n selectedStorageAccountID: this.SelectedStorageAccountID\n });\n\n if (!entityId || !recordId) {\n const errMsg = `Cannot upload attachments: Missing record context (EntityID: ${entityId}, RecordID: ${recordId})`;\n console.error(`[RecordAttachmentsComponent] ${errMsg}`);\n this.notifications.CreateSimpleNotification('Cannot upload attachments: No record context available', 'error');\n return [];\n }\n\n if (this.StorageAccounts.length === 0) {\n const errMsg = 'Cannot upload attachments: No active file storage accounts are configured. Please configure a storage provider in system settings.';\n console.warn(`[RecordAttachmentsComponent] ${errMsg}`);\n this.notifications.CreateSimpleNotification(errMsg, 'warning');\n return [];\n }\n\n const targetAccountID = storageAccountId ?? this.SelectedStorageAccountID ?? this.StorageAccounts[0]?.account?.ID;\n const targetCategoryID = categoryId ?? this.Config?.DefaultCategoryID;\n\n // Fire BeforeUpload event\n const beforeEvent = new BeforeUploadAttachmentEventArgs(files, targetAccountID, targetCategoryID);\n this.BeforeUpload.emit(beforeEvent);\n if (beforeEvent.Cancel) {\n console.log('[RecordAttachmentsComponent] Upload cancelled by BeforeUpload event');\n return [];\n }\n\n this.IsUploading = true;\n this.UploadProgressPercent = 5;\n this.UploadStatusText = `Preparing ${files.length} file${files.length === 1 ? '' : 's'}...`;\n this.cdr.markForCheck();\n\n const uploadedItems: RecordAttachmentItem[] = [];\n const uploadedFileEntities: MJFileEntity[] = [];\n\n try {\n const md = this.ProviderToUse;\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const fileIndex = i + 1;\n const progressBase = Math.round((i / files.length) * 100);\n\n this.UploadingFileName = file.name;\n this.UploadStatusText = `Reading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 10);\n this.cdr.markForCheck();\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Starting upload for '${file.name}' (${FormatAttachmentFileSize(file.size)}, type: '${file.type}')`);\n\n // Enforce max size if configured\n if (this.Config?.MaxFileSizeBytes && file.size > this.Config.MaxFileSizeBytes) {\n const maxStr = FormatAttachmentFileSize(this.Config.MaxFileSizeBytes);\n console.warn(`[RecordAttachmentsComponent] File '${file.name}' exceeds max size of ${maxStr}`);\n this.notifications.CreateSimpleNotification(`File '${file.name}' exceeds max size of ${maxStr}`, 'error');\n continue;\n }\n\n let fileId: string | null = null;\n let fileEntity: MJFileEntity | null = null;\n let directUploadSucceeded = false;\n\n const targetAccount = this.StorageAccounts.find((a) => UUIDsEqual(a.account.ID, targetAccountID));\n const timestamp = new Date().toISOString().slice(0, 10);\n const uniqueId = typeof crypto !== 'undefined' && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).substring(2, 11);\n const objectPath = `artifacts/${timestamp}/${uniqueId}/${file.name}`;\n\n // ─────────────────────────────────────────────────────────────────────\n // 1. Try Direct Binary Upload via Pre-Authenticated URL (for S3, Azure Blob, GCS)\n // ─────────────────────────────────────────────────────────────────────\n const supportsDirectPreAuth = this.providerSupportsDirectUpload(targetAccount?.provider);\n if (supportsDirectPreAuth) {\n try {\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Requesting pre-auth upload URL for '${file.name}' on account '${targetAccountID}'...`);\n const preAuthResult = await GraphQLDataProvider.ExecuteGQL(CreatePreAuthUploadUrlMutation, {\n input: {\n AccountID: targetAccountID,\n ObjectName: objectPath,\n ContentType: file.type || 'application/octet-stream',\n },\n });\n\n const parsedPreAuth = CreatePreAuthUploadUrlMutationSchema.safeParse(preAuthResult);\n if (\n parsedPreAuth.success &&\n parsedPreAuth.data.CreatePreAuthUploadUrl.UploadUrl\n ) {\n const preAuth = parsedPreAuth.data.CreatePreAuthUploadUrl;\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Direct binary upload URL obtained. Streaming raw bytes...`);\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}) directly to storage...`;\n this.cdr.markForCheck();\n\n if (preAuth.UploadUrl) {\n await this.uploadBinaryDirect(\n preAuth.UploadUrl,\n file,\n (loaded, total) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const percent = Math.round((loaded / total) * 100);\n const computedPercent = Math.min(95, Math.round(currentFileBase + (percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(loaded);\n const totalStr = FormatAttachmentFileSize(total);\n if (percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${percent}%)...`;\n } else {\n this.UploadStatusText = `Registering ${file.name} in MemberJunction...`;\n }\n this.cdr.markForCheck();\n }\n );\n\n // Raw binary upload to cloud storage succeeded! Create MJ: Files database record\n this.UploadStatusText = `Saving ${file.name} record...`;\n this.cdr.markForCheck();\n\n const newFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n newFile.Name = file.name;\n newFile.ContentType = file.type || 'application/octet-stream';\n newFile.ProviderID = targetAccount?.provider?.ID || '';\n newFile.ProviderKey = preAuth.ProviderKey || objectPath;\n if (targetCategoryID) {\n newFile.CategoryID = targetCategoryID;\n }\n newFile.Status = 'Uploaded';\n const saved = await newFile.Save();\n if (saved) {\n fileEntity = newFile;\n fileId = newFile.ID;\n directUploadSucceeded = true;\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Direct binary upload & file record created (FileID: ${fileId})`);\n }\n }\n }\n } catch (preAuthErr) {\n console.warn(`[RecordAttachmentsComponent] Direct binary upload failed for '${file.name}', falling back to server upload:`, preAuthErr);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────\n // 2. Tier 2: Ephemeral Binary Upload Staging + GraphQL Token Commit\n // ─────────────────────────────────────────────────────────────────────\n if (!directUploadSucceeded || !fileId) {\n try {\n // Mint a cryptographically signed media-upload staging token\n const mintResult = await GraphQLDataProvider.ExecuteGQL(CreateUploadStageTokenMutation, {});\n const parsedMint = CreateUploadStageTokenMutationSchema.safeParse(mintResult);\n const stageToken = parsedMint.success && parsedMint.data.CreateUploadStageToken.Success\n ? parsedMint.data.CreateUploadStageToken.Token\n : null;\n\n if (!stageToken) {\n throw new Error('Failed to obtain authenticated upload staging token.');\n }\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Staging binary bytes via /media/upload-stage...`);\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 2);\n this.cdr.markForCheck();\n\n const uploadToken = await this.uploadBinaryStage(file, stageToken, (loaded, total) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const percent = Math.round((loaded / total) * 100);\n const computedPercent = Math.min(95, Math.round(currentFileBase + (percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(loaded);\n const totalStr = FormatAttachmentFileSize(total);\n if (percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${percent}%)...`;\n } else {\n this.UploadStatusText = `Saving ${file.name} to storage provider...`;\n }\n this.cdr.markForCheck();\n });\n\n this.UploadStatusText = `Finalizing ${file.name} in MemberJunction...`;\n this.cdr.markForCheck();\n\n const gqlResult = await GraphQLDataProvider.ExecuteGQL(UploadStorageFileMutation, {\n input: {\n UploadToken: uploadToken,\n FileName: file.name,\n MimeType: file.type || 'application/octet-stream',\n AccountID: beforeEvent.StorageAccountID || undefined,\n CategoryID: beforeEvent.CategoryID || undefined,\n },\n });\n\n const parsed = UploadStorageFileMutationSchema.safeParse(gqlResult);\n if (parsed.success && parsed.data.UploadStorageFile.Success && parsed.data.UploadStorageFile.FileID) {\n fileId = parsed.data.UploadStorageFile.FileID;\n const loadedFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n const ok = await loadedFile.Load(fileId);\n if (ok) {\n fileEntity = loadedFile;\n directUploadSucceeded = true;\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Tier 2 binary staging & upload completed (FileID: ${fileId})`);\n }\n }\n } catch (stageErr) {\n console.warn(`[RecordAttachmentsComponent] Tier 2 binary staging failed, falling back to base64:`, stageErr);\n }\n }\n\n // ─────────────────────────────────────────────────────────────────────\n // 3. Tier 3 (Fallback): Base64 Upload via UploadStorageFile mutation\n // ─────────────────────────────────────────────────────────────────────\n if (!directUploadSucceeded || !fileId) {\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Using Tier 3 fallback base64 server upload...`);\n const base64Data = await this.fileToBase64(file);\n\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length})...`;\n this.UploadProgressPercent = Math.max(5, progressBase + 2);\n this.cdr.markForCheck();\n\n const input = {\n FileName: file.name,\n Base64Data: base64Data,\n MimeType: file.type || 'application/octet-stream',\n AccountID: beforeEvent.StorageAccountID || undefined,\n CategoryID: beforeEvent.CategoryID || undefined,\n };\n\n const gqlResult = await GraphQLDataProvider.ExecuteGQLWithProgress(\n UploadStorageFileMutation,\n { input },\n (progress) => {\n const singleFileSlice = 85 / files.length;\n const currentFileBase = (i / files.length) * 100;\n const computedPercent = Math.min(95, Math.round(currentFileBase + (progress.percent * singleFileSlice / 100)));\n this.UploadProgressPercent = computedPercent;\n const loadedStr = FormatAttachmentFileSize(progress.loaded);\n const totalStr = FormatAttachmentFileSize(progress.total);\n if (progress.percent < 100) {\n this.UploadStatusText = `Uploading ${file.name} (${fileIndex}/${files.length}): ${loadedStr} / ${totalStr} (${progress.percent}%)...`;\n } else {\n this.UploadStatusText = `Processing ${file.name} on storage server...`;\n }\n this.cdr.markForCheck();\n }\n );\n\n const parsed = UploadStorageFileMutationSchema.safeParse(gqlResult);\n if (!parsed.success || !parsed.data.UploadStorageFile.Success || !parsed.data.UploadStorageFile.FileID) {\n const errorMsg = parsed.success ? parsed.data.UploadStorageFile.ErrorMessage : 'Upload response parsing failed';\n console.error(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Failed to upload '${file.name}':`, errorMsg, parsed);\n this.notifications.CreateSimpleNotification(`Failed to upload '${file.name}': ${errorMsg || 'Unknown error'}`, 'error');\n continue;\n }\n\n fileId = parsed.data.UploadStorageFile.FileID;\n const loadedFile = await md.GetEntityObject<MJFileEntity>('MJ: Files');\n const ok = await loadedFile.Load(fileId);\n if (ok) {\n fileEntity = loadedFile;\n }\n }\n\n if (!fileId || !fileEntity) {\n console.error(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] File record unavailable for '${file.name}'`);\n continue;\n }\n\n uploadedFileEntities.push(fileEntity);\n\n this.UploadStatusText = `Linking ${file.name} to record...`;\n this.UploadProgressPercent = progressBase + Math.round((1 / files.length) * 95);\n this.cdr.markForCheck();\n\n // Create Link Entity\n const linkEntity: MJFileEntityRecordLinkEntity = await md.GetEntityObject('MJ: File Entity Record Links');\n linkEntity.FileID = fileId;\n linkEntity.EntityID = entityId;\n linkEntity.RecordID = recordId;\n const linkSuccess = await linkEntity.Save();\n\n console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Record link saved (success: ${linkSuccess}, LinkID: ${linkEntity.ID})`);\n\n if (linkSuccess && fileEntity) {\n const provider = fileEntity.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, fileEntity.ProviderID)) : undefined;\n const config = provider?.ConfigurationObject;\n const newItem: RecordAttachmentItem = {\n LinkID: linkEntity.ID,\n FileID: fileEntity.ID,\n Name: fileEntity.Name,\n Description: fileEntity.Description,\n ContentType: fileEntity.ContentType,\n Status: fileEntity.Status,\n ProviderName: fileEntity.Provider,\n ProviderID: fileEntity.ProviderID,\n ProviderIconClass: config?.IconClass || this.GetFallbackProviderIcon(fileEntity.Provider),\n ProviderBrandColor: config?.BrandColor || undefined,\n CategoryID: fileEntity.CategoryID,\n CategoryName: fileEntity.Category,\n CreatedAt: new Date(),\n FileSize: file.size,\n FileEntity: fileEntity,\n LinkEntity: linkEntity,\n };\n uploadedItems.push(newItem);\n this.Attachments.unshift(newItem);\n }\n }\n\n this.UploadProgressPercent = 100;\n this.UploadStatusText = 'Upload complete!';\n this.cdr.markForCheck();\n\n if (uploadedItems.length > 0) {\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterUpload.emit(new AfterUploadAttachmentEventArgs(uploadedItems, uploadedFileEntities));\n this.notifications.CreateSimpleNotification(\n `Successfully attached ${uploadedItems.length} file${uploadedItems.length === 1 ? '' : 's'}`,\n 'success'\n );\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Upload error:', err);\n const errMsg = err instanceof Error ? err.message : 'Error uploading attachments';\n this.notifications.CreateSimpleNotification(errMsg, 'error');\n } finally {\n this.IsUploading = false;\n this.UploadProgressPercent = 0;\n this.UploadStatusText = '';\n this.UploadingFileName = '';\n this.cdr.markForCheck();\n }\n\n return uploadedItems;\n }\n\n /**\n * Unlinks an attachment from the record (keeps file in storage).\n */\n public async UnlinkAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforeUnlinkAttachmentEventArgs(attachment);\n this.BeforeUnlink.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const linkEntity: MJFileEntityRecordLinkEntity = attachment.LinkEntity ?? (await md.GetEntityObject('MJ: File Entity Record Links'));\n if (!attachment.LinkEntity) {\n await linkEntity.Load(attachment.LinkID);\n }\n\n const success = await linkEntity.Delete();\n if (success) {\n this.Attachments = this.Attachments.filter((a) => !UUIDsEqual(a.LinkID, attachment.LinkID));\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterUnlink.emit(new AfterUnlinkAttachmentEventArgs(attachment));\n this.notifications.CreateSimpleNotification(`Unlinked '${attachment.Name}' from record`, 'info');\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Failed to unlink '${attachment.Name}'`, 'error');\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Unlink error:', err);\n this.notifications.CreateSimpleNotification('Failed to unlink attachment', 'error');\n return false;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Deletes an attachment completely (unlinks and deletes from storage provider).\n */\n public async DeleteAttachment(attachment: RecordAttachmentItem, hardDelete: boolean = true): Promise<boolean> {\n const beforeEvent = new BeforeDeleteAttachmentEventArgs(attachment, hardDelete);\n this.BeforeDelete.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n\n // 1. Delete link\n if (attachment.LinkID) {\n const linkEntity: MJFileEntityRecordLinkEntity = attachment.LinkEntity ?? (await md.GetEntityObject('MJ: File Entity Record Links'));\n if (!attachment.LinkEntity) {\n await linkEntity.Load(attachment.LinkID);\n }\n await linkEntity.Delete();\n }\n\n // 2. Delete file if hardDelete requested\n if (hardDelete && attachment.FileID) {\n const fileEntity: MJFileEntity = attachment.FileEntity ?? (await md.GetEntityObject('MJ: Files'));\n if (!attachment.FileEntity) {\n await fileEntity.Load(attachment.FileID);\n }\n await fileEntity.Delete();\n }\n\n this.Attachments = this.Attachments.filter((a) => !UUIDsEqual(a.LinkID, attachment.LinkID));\n this.AttachmentCountChanged.emit(this.Attachments.length);\n this.AfterDelete.emit(new AfterDeleteAttachmentEventArgs(attachment, hardDelete));\n this.notifications.CreateSimpleNotification(`Deleted '${attachment.Name}'`, 'info');\n return true;\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Delete error:', err);\n this.notifications.CreateSimpleNotification('Failed to delete attachment', 'error');\n return false;\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Resolves an authenticated inline URL for streaming, previewing, and opening in a new tab.\n * Prefers the inline streaming endpoint (/media/:fileId?token=...) so the browser renders\n * the document/media natively without triggering forced attachment downloads or Save As dialogs.\n */\n private async getInlineFileUrl(fileId: string): Promise<string | null> {\n try {\n const mediaResult = await GraphQLDataProvider.ExecuteGQL(CreateMediaAccessTokenMutation, { fileId });\n const parsedMedia = CreateMediaAccessTokenMutationSchema.safeParse(mediaResult);\n if (parsedMedia.success && parsedMedia.data.CreateMediaAccessToken.Success && parsedMedia.data.CreateMediaAccessToken.Url) {\n return parsedMedia.data.CreateMediaAccessToken.Url;\n }\n } catch (err) {\n console.warn('[RecordAttachmentsComponent] CreateMediaAccessToken failed, trying fallback DownloadUrl:', err);\n }\n\n try {\n const gqlResult = await GraphQLDataProvider.ExecuteGQL(FileDownloadQuery, { FileID: fileId });\n const parsed = FileDownloadQuerySchema.safeParse(gqlResult);\n if (parsed.success && parsed.data.MJFile?.DownloadUrl) {\n return parsed.data.MJFile.DownloadUrl;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] GetInlineFileUrl fallback failed:', err);\n }\n\n return null;\n }\n\n /**\n * Opens the attachment in a new browser tab for direct viewing.\n */\n public async DownloadAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforeDownloadAttachmentEventArgs(attachment);\n this.BeforeDownload.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n try {\n const url = await this.getInlineFileUrl(attachment.FileID);\n if (url) {\n // Open directly in a new tab so the browser displays the document\n window.open(url, '_blank', 'noopener,noreferrer');\n this.AfterDownload.emit(new AfterDownloadAttachmentEventArgs(attachment, url));\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Unable to open '${attachment.Name}'`, 'error');\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Open in tab error:', err);\n this.notifications.CreateSimpleNotification('Failed to open file', 'error');\n return false;\n }\n }\n\n /**\n * Opens the in-app rich media preview modal for an attachment.\n */\n public async PreviewAttachment(attachment: RecordAttachmentItem): Promise<boolean> {\n const beforeEvent = new BeforePreviewAttachmentEventArgs(attachment);\n this.BeforePreview.emit(beforeEvent);\n if (beforeEvent.Cancel) return false;\n\n this.ActivePreviewItem = attachment;\n this.IsLoadingPreview = true;\n this.IsMediaLoaded = false;\n this.PreviewModalOpen = true;\n this.ActivePreviewUrl = null;\n this.ActivePreviewSafeUrl = null;\n this.ActivePreviewTextContent = null;\n this.cdr.markForCheck();\n\n try {\n const url = await this.getInlineFileUrl(attachment.FileID);\n if (url) {\n this.ActivePreviewUrl = url;\n this.ActivePreviewSafeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);\n\n // For text media types, fetch content directly for syntax preview\n const mediaType = this.GetMediaType(attachment);\n if (mediaType === 'text') {\n try {\n const resp = await window.fetch(url);\n if (resp.ok) {\n this.ActivePreviewTextContent = await resp.text();\n }\n } catch {\n // Text fetch failed, fallback to viewer\n }\n this.IsMediaLoaded = true;\n }\n\n this.AfterPreview.emit(new AfterPreviewAttachmentEventArgs(attachment));\n return true;\n } else {\n this.notifications.CreateSimpleNotification(`Unable to load preview for '${attachment.Name}'`, 'error');\n this.IsMediaLoaded = true;\n return false;\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Preview error:', err);\n this.notifications.CreateSimpleNotification('Preview failed', 'error');\n this.IsMediaLoaded = true;\n return false;\n } finally {\n this.IsLoadingPreview = false;\n this.cdr.markForCheck();\n }\n }\n\n public OnPreviewMediaLoaded(): void {\n if (this.mediaLoadedTimer) clearTimeout(this.mediaLoadedTimer);\n // Smoothly retain loading spinner for ~350ms so internal iframe/canvas rasterization finishes before fade-in\n this.mediaLoadedTimer = setTimeout(() => {\n this.IsMediaLoaded = true;\n this.cdr.markForCheck();\n }, 350);\n }\n\n /**\n * Opens the file record in a dedicated MJ Explorer workspace tab and closes the attachments slide-in panel.\n * If running standalone/outside Explorer, falls back to opening the in-app media preview modal.\n */\n public OpenAttachmentRecord(attachment: RecordAttachmentItem): void {\n if (attachment.FileID) {\n const pkey = CompositeKey.FromID(attachment.FileID); // first-pk-ok: FileID is the FK to MJ: Files (opened two lines below) — core entity keyed by ID\n if (this.navigationService) {\n this.navigationService.OpenEntityRecord('MJ: Files', pkey);\n } else {\n SharedService.Instance.OpenEntityRecord('MJ: Files', pkey);\n }\n this.ClosePanel();\n this.ClosePreviewModal();\n } else {\n void this.PreviewAttachment(attachment);\n }\n }\n\n /**\n * Initiates replace workflow for an existing attachment.\n */\n public RequestReplace(attachment: RecordAttachmentItem): void {\n this.pendingReplaceItem = attachment;\n this.ReplaceInputRef?.nativeElement.click();\n }\n\n /**\n * Replaces an existing attachment with a newly uploaded file.\n */\n public async ReplaceAttachment(attachment: RecordAttachmentItem, newFile: File): Promise<RecordAttachmentItem | null> {\n const beforeEvent = new BeforeReplaceAttachmentEventArgs(attachment, newFile);\n this.BeforeReplace.emit(beforeEvent);\n if (beforeEvent.Cancel) return null;\n\n this.IsUploading = true;\n this.cdr.markForCheck();\n\n try {\n // 1. Upload new file\n const uploaded = await this.UploadFiles([newFile], attachment.StorageAccountID || undefined, attachment.CategoryID || undefined);\n if (uploaded.length === 0) return null;\n\n const newAttachment = uploaded[0];\n\n // 2. Unlink old file\n await this.UnlinkAttachment(attachment);\n\n this.AfterReplace.emit(new AfterReplaceAttachmentEventArgs(attachment, newAttachment));\n this.notifications.CreateSimpleNotification(`Replaced '${attachment.Name}' with '${newAttachment.Name}'`, 'success');\n return newAttachment;\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Replace error:', err);\n this.notifications.CreateSimpleNotification('Replace failed', 'error');\n return null;\n } finally {\n this.IsUploading = false;\n this.cdr.markForCheck();\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // UI Actions & Helpers\n // ────────────────────────────────────────────────────────────────────\n\n public ClosePanel(): void {\n this.PanelClosed.emit();\n }\n\n public ClosePreviewModal(): void {\n if (this.mediaLoadedTimer) {\n clearTimeout(this.mediaLoadedTimer);\n }\n this.PreviewModalOpen = false;\n this.IsLoadingPreview = false;\n this.IsMediaLoaded = false;\n this.ActivePreviewItem = null;\n this.ActivePreviewUrl = null;\n this.ActivePreviewSafeUrl = null;\n this.ActivePreviewTextContent = null;\n this.cdr.markForCheck();\n }\n\n public OpenEditMetadata(attachment: RecordAttachmentItem): void {\n this.EditMetadataItem = attachment;\n this.EditMetadataName = attachment.Name;\n this.EditMetadataDescription = attachment.Description || '';\n this.EditMetadataModalOpen = true;\n this.cdr.markForCheck();\n }\n\n public CloseEditMetadataModal(): void {\n this.EditMetadataModalOpen = false;\n this.EditMetadataItem = null;\n this.cdr.markForCheck();\n }\n\n public async SaveEditMetadata(): Promise<void> {\n if (!this.EditMetadataItem || !this.EditMetadataName.trim()) return;\n\n this.IsLoading = true;\n this.cdr.markForCheck();\n\n try {\n const md = this.ProviderToUse;\n const fileEntity: MJFileEntity = this.EditMetadataItem.FileEntity ?? (await md.GetEntityObject('MJ: Files'));\n if (!this.EditMetadataItem.FileEntity) {\n await fileEntity.Load(this.EditMetadataItem.FileID);\n }\n\n fileEntity.Name = this.EditMetadataName.trim();\n fileEntity.Description = this.EditMetadataDescription.trim() || null;\n\n const success = await fileEntity.Save();\n if (success) {\n this.EditMetadataItem.Name = fileEntity.Name;\n this.EditMetadataItem.Description = fileEntity.Description;\n this.notifications.CreateSimpleNotification('Attachment details updated', 'success');\n this.CloseEditMetadataModal();\n } else {\n this.notifications.CreateSimpleNotification('Failed to update attachment details', 'error');\n }\n } catch (err) {\n console.error('[RecordAttachmentsComponent] Save metadata error:', err);\n this.notifications.CreateSimpleNotification('Update failed', 'error');\n } finally {\n this.IsLoading = false;\n this.cdr.markForCheck();\n }\n }\n\n public OnFilesSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n console.log('[RecordAttachmentsComponent] OnFilesSelected event fired, files count:', input.files?.length);\n if (input.files && input.files.length > 0) {\n const filesArray = Array.from(input.files);\n input.value = '';\n void this.UploadFiles(filesArray);\n }\n }\n\n public OnReplaceFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n console.log('[RecordAttachmentsComponent] OnReplaceFileSelected event fired, files count:', input.files?.length);\n if (input.files && input.files.length > 0 && this.pendingReplaceItem) {\n const file = input.files[0];\n const target = this.pendingReplaceItem;\n this.pendingReplaceItem = null;\n input.value = '';\n void this.ReplaceAttachment(target, file);\n }\n }\n\n public OnDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n public OnDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n console.log('[RecordAttachmentsComponent] OnDrop event fired, dataTransfer files count:', event.dataTransfer?.files?.length);\n if (event.dataTransfer?.files && event.dataTransfer.files.length > 0) {\n const filesArray = Array.from(event.dataTransfer.files);\n void this.UploadFiles(filesArray);\n }\n }\n\n public GetMediaType(attachment: RecordAttachmentItem): AttachmentMediaType {\n return GetAttachmentMediaType(attachment.ContentType, attachment.Name);\n }\n\n public FormatSize(bytes?: number | null): string {\n return FormatAttachmentFileSize(bytes);\n }\n\n public GetFileIcon(attachment: RecordAttachmentItem): string {\n const mediaType = this.GetMediaType(attachment);\n switch (mediaType) {\n case 'pdf':\n return 'fa-solid fa-file-pdf';\n case 'image':\n return 'fa-solid fa-file-image';\n case 'video':\n return 'fa-solid fa-file-video';\n case 'audio':\n return 'fa-solid fa-file-audio';\n case 'text':\n return 'fa-solid fa-file-code';\n case 'document':\n return 'fa-solid fa-file-word';\n default:\n return 'fa-solid fa-file';\n }\n }\n\n public GetFileColorClass(attachment: RecordAttachmentItem): string {\n const mediaType = this.GetMediaType(attachment);\n return `mj-attachment-thumb--${mediaType}`;\n }\n\n @HostListener('document:click')\n public OnDocumentClick(): void {\n this.CloseItemMenu();\n }\n\n @HostListener('document:keydown.escape')\n public OnEscapePress(): void {\n this.CloseItemMenu();\n }\n\n public ToggleItemMenu(event: MouseEvent, item: RecordAttachmentItem): void {\n event.stopPropagation();\n this.ActiveMenuLinkID = this.ActiveMenuLinkID === item.LinkID ? null : item.LinkID;\n this.cdr.markForCheck();\n }\n\n public CloseItemMenu(): void {\n if (this.ActiveMenuLinkID !== null) {\n this.ActiveMenuLinkID = null;\n this.cdr.markForCheck();\n }\n }\n\n public GetProviderIcon(item: RecordAttachmentItem): string {\n if (item.ProviderIconClass) {\n return item.ProviderIconClass;\n }\n const provider = item.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, item.ProviderID)) : null;\n const config = provider?.ConfigurationObject;\n if (config?.IconClass) {\n return config.IconClass;\n }\n return this.GetFallbackProviderIcon(item.ProviderName);\n }\n\n public GetProviderBrandColor(item: RecordAttachmentItem): string | undefined {\n if (item.ProviderBrandColor) {\n return item.ProviderBrandColor;\n }\n const provider = item.ProviderID ? this.ActiveProviders.find(p => UUIDsEqual(p.ID, item.ProviderID)) : null;\n const config = provider?.ConfigurationObject;\n return config?.BrandColor || undefined;\n }\n\n public GetFallbackProviderIcon(providerName?: string | null): string {\n const name = (providerName || '').toLowerCase();\n if (name.includes('box')) return 'fa-solid fa-box';\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') || name.includes('gcs') || name.includes('google')) return 'fa-brands fa-google';\n if (name.includes('dropbox')) return 'fa-brands fa-dropbox';\n if (name.includes('sharepoint') || name.includes('onedrive')) return 'fa-brands fa-microsoft';\n return 'fa-solid fa-cloud';\n }\n\n private providerSupportsDirectUpload(provider?: MJFileStorageProviderEntity | null): boolean {\n if (!provider) return false;\n const key = (provider.ServerDriverKey || '').toLowerCase();\n const name = (provider.Name || '').toLowerCase();\n return (\n key.includes('aws') ||\n key.includes('azure') ||\n key.includes('google cloud') ||\n name.includes('aws') ||\n name.includes('s3') ||\n name.includes('azure') ||\n name.includes('google cloud')\n );\n }\n\n private triggerBrowserDownload(url: string, fileName: string): void {\n const link = document.createElement('a');\n link.href = url;\n link.download = fileName;\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n link.parentNode?.removeChild(link);\n }\n\n /**\n * Performs an authenticated direct binary upload of a raw File/Blob to a pre-authenticated cloud storage URL.\n */\n private uploadBinaryDirect(\n uploadUrl: string,\n file: File,\n onProgress?: (loaded: number, total: number) => void\n ): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open('PUT', uploadUrl, true);\n\n // Set standard content type\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n\n // For Azure Blob Storage SAS uploads, add the required block blob header\n if (uploadUrl.includes('.blob.core.windows.net')) {\n xhr.setRequestHeader('x-ms-blob-type', 'BlockBlob');\n }\n\n if (xhr.upload && onProgress) {\n xhr.upload.onprogress = (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded, event.total);\n }\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(true);\n } else {\n reject(new Error(`Direct binary upload failed with HTTP status ${xhr.status}: ${xhr.statusText}`));\n }\n };\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred during direct binary upload.'));\n };\n\n xhr.ontimeout = () => {\n reject(new Error('Direct binary upload timed out.'));\n };\n\n xhr.send(file);\n });\n }\n\n /**\n * Performs an authenticated raw binary streaming upload to the /media/upload-stage REST endpoint.\n * Uses the cryptographically signed media-upload token minted by CreateUploadStageToken.\n * Returns an ephemeral single-use upload token to pass to the GraphQL UploadStorageFile mutation.\n */\n private uploadBinaryStage(\n file: File,\n stageToken: string,\n onProgress?: (loaded: number, total: number) => void\n ): Promise<string> {\n return new Promise((resolve, reject) => {\n let uploadUrl = '/media/upload-stage';\n // The configured MJAPI URL (MJAPI_URI, MJ #5674); otherwise the pre-#5674 derivation from the GraphQL URL.\n const configData = GraphQLDataProvider.Instance?.ConfigData;\n const gqlUrl = configData?.URL;\n if (configData?.MJAPIURL) {\n uploadUrl = `${configData.MJAPIURL}/media/upload-stage`;\n } else if (gqlUrl && gqlUrl.startsWith('http')) {\n uploadUrl = gqlUrl.replace(/\\/graphql\\/?$/i, '').replace(/\\/+$/, '') + '/media/upload-stage';\n }\n\n const xhr = new XMLHttpRequest();\n xhr.open('POST', uploadUrl, true);\n\n // Signed media-upload token\n xhr.setRequestHeader('Authorization', `Bearer ${stageToken}`);\n\n // Metadata headers\n xhr.setRequestHeader('Content-Type', file.type || 'application/octet-stream');\n xhr.setRequestHeader('x-file-name', encodeURIComponent(file.name));\n\n if (xhr.upload && onProgress) {\n xhr.upload.onprogress = (event: ProgressEvent) => {\n if (event.lengthComputable) {\n onProgress(event.loaded, event.total);\n }\n };\n }\n\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const res = JSON.parse(xhr.responseText) as { Success?: boolean; UploadToken?: string; ErrorMessage?: string };\n if (res.Success && res.UploadToken) {\n resolve(res.UploadToken);\n } else {\n reject(new Error(res.ErrorMessage || 'Upload staging returned unsuccessful status'));\n }\n } catch {\n reject(new Error('Failed to parse upload staging response JSON'));\n }\n } else {\n let errorDetail = xhr.statusText;\n try {\n const errRes = JSON.parse(xhr.responseText) as { ErrorMessage?: string };\n if (errRes.ErrorMessage) {\n errorDetail = errRes.ErrorMessage;\n }\n } catch {\n // keep statusText\n }\n reject(new Error(`Upload staging failed with HTTP status ${xhr.status}: ${errorDetail}`));\n }\n };\n\n xhr.onerror = () => {\n reject(new Error('Network error occurred during upload staging.'));\n };\n\n xhr.ontimeout = () => {\n reject(new Error('Upload staging timed out.'));\n };\n\n xhr.send(file);\n });\n }\n\n private fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result;\n if (typeof result === 'string') {\n const base64 = result.substring(result.indexOf(',') + 1);\n resolve(base64);\n } else {\n reject(new Error('Failed to read file as base64 string'));\n }\n };\n reader.onerror = (err) => reject(err);\n reader.readAsDataURL(file);\n });\n }\n}\n","<mj-slide-panel\n [Mode]=\"'slide'\"\n [Title]=\"Title\"\n [Visible]=\"Visible\"\n [Resizable]=\"Resizable\"\n [MinWidthPx]=\"MinWidthPx\"\n [MaxWidthRatio]=\"MaxWidthRatio\"\n [WidthPx]=\"WidthPx\"\n (Closed)=\"ClosePanel()\"\n (WidthChanged)=\"OnWidthChanged($event)\">\n\n <div class=\"mj-record-attachments-wrapper\">\n \n <!-- Top Meta Strip -->\n <div class=\"mj-record-attachments-meta-strip\">\n <div class=\"mj-record-attachments-summary\">\n <span class=\"mj-record-attachments-badge\">\n {{ Attachments.length }} {{ Attachments.length === 1 ? 'attachment' : 'attachments' }}\n @if (Attachments.length > 0) {\n • {{ TotalSizeFormatted }}\n }\n </span>\n </div>\n\n <div class=\"mj-record-attachments-top-actions\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"Refresh()\" [disabled]=\"IsLoading\" title=\"Refresh attachments\">\n <i class=\"fa-solid fa-rotate-right\" [class.fa-spin]=\"IsLoading\"></i>\n </button>\n </div>\n </div>\n\n <!-- Provider Filter Pills & View Toggle -->\n <div class=\"mj-record-attachments-controls-bar\">\n @if (ShowProviderFilter && ActiveProviders.length > 1) {\n <div class=\"mj-provider-pills\">\n <button type=\"button\" class=\"mj-provider-pill\" [class.active]=\"SelectedProviderFilter === 'all'\" (click)=\"SelectedProviderFilter = 'all'\">\n <span>All Providers</span>\n <span class=\"mj-pill-count\">({{ Attachments.length }})</span>\n </button>\n @for (provider of ActiveProviders; track provider.ID) {\n <button type=\"button\" class=\"mj-provider-pill\" [class.active]=\"SelectedProviderFilter === provider.ID\" (click)=\"SelectedProviderFilter = provider.ID\">\n <span>{{ provider.Name }}</span>\n <span class=\"mj-pill-count\">({{ GetProviderItemCount(provider.ID) }})</span>\n </button>\n }\n </div>\n }\n\n <div class=\"mj-view-controls\">\n <button type=\"button\" class=\"mj-view-toggle-btn\" [class.active]=\"ViewMode === 'grid'\" (click)=\"SetViewMode('grid')\" title=\"Card Grid View\">\n <i class=\"fa-solid fa-grip\"></i>\n </button>\n <button type=\"button\" class=\"mj-view-toggle-btn\" [class.active]=\"ViewMode === 'list'\" (click)=\"SetViewMode('list')\" title=\"Detailed List View\">\n <i class=\"fa-solid fa-list\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"mj-record-attachments-content\">\n \n @if (!IsLoading && StorageAccounts.length === 0) {\n <div class=\"mj-record-attachments-alert\">\n <mj-alert\n Type=\"warning\"\n Title=\"No Active Storage Providers Configured\"\n Message=\"No active file storage providers or accounts were found. Configure a storage provider (such as Azure Blob Storage, AWS S3, or Box) in the Storage Subsystem settings to enable uploading files.\">\n </mj-alert>\n </div>\n }\n\n <!-- Upload Progress Status Banner -->\n @if (IsUploading) {\n <div class=\"mj-upload-progress-banner\">\n <div class=\"mj-upload-progress-header\">\n <div class=\"mj-upload-progress-info\">\n <i class=\"fa-solid fa-cloud-arrow-up fa-bounce mj-upload-progress-icon\"></i>\n <span class=\"mj-upload-progress-text\">{{ UploadStatusText }}</span>\n </div>\n <span class=\"mj-upload-progress-pct\">{{ UploadProgressPercent }}%</span>\n </div>\n <div class=\"mj-upload-progress-track\">\n <div class=\"mj-upload-progress-bar\" [style.width.%]=\"UploadProgressPercent\"></div>\n </div>\n </div>\n }\n\n <!-- Drag & Drop Upload Zone -->\n @if (EffectiveAllowUpload) {\n <div class=\"mj-upload-dropzone\" [class.disabled]=\"IsUploading\" (dragover)=\"OnDragOver($event)\" (drop)=\"OnDrop($event)\" (click)=\"!IsUploading && fileInputRef.click()\">\n <i class=\"fa-solid fa-cloud-arrow-up mj-upload-dropzone-icon\"></i>\n <div class=\"mj-upload-dropzone-title\">\n Drop files to attach, or <span class=\"mj-upload-dropzone-link\">Browse</span>\n </div>\n <div class=\"mj-upload-dropzone-subtitle\">\n Direct secure storage upload • Max {{ Config?.MaxFileSizeBytes ? FormatSize(Config?.MaxFileSizeBytes) : '50 MB' }}\n </div>\n\n @if (StorageAccounts.length > 1) {\n <div class=\"mj-upload-storage-row\" (click)=\"$event.stopPropagation()\">\n <span>Target storage:</span>\n <select class=\"mj-upload-storage-select\" [(ngModel)]=\"SelectedStorageAccountID\" [disabled]=\"IsUploading\">\n @for (sa of StorageAccounts; track sa.account.ID) {\n <option [value]=\"sa.account.ID\">{{ sa.account.Name }} ({{ sa.provider.Name }})</option>\n }\n </select>\n </div>\n }\n <input type=\"file\" #fileInputRef multiple style=\"display: none;\" (change)=\"OnFilesSelected($event)\" />\n </div>\n }\n\n <!-- Search Filter -->\n @if (ShowSearch && Attachments.length > 0) {\n <div class=\"mj-attachments-search-bar\">\n <i class=\"fa-solid fa-magnifying-glass\"></i>\n <input type=\"text\" [(ngModel)]=\"SearchTerm\" placeholder=\"Filter attachments by name, category, extension...\" />\n @if (SearchTerm) {\n <button type=\"button\" class=\"mj-clear-search-btn\" (click)=\"SearchTerm = ''\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Hidden Input for Replace Action -->\n <input type=\"file\" #replaceInputRef style=\"display: none;\" (change)=\"OnReplaceFileSelected($event)\" />\n\n <!-- Attachments List / Grid -->\n @if (IsLoading) {\n <div class=\"mj-record-attachments-loading\">\n <mj-loading text=\"Loading attachments...\"></mj-loading>\n </div>\n } @else if (FilteredAttachments.length === 0) {\n <mj-empty-state\n Icon=\"fa-solid fa-paperclip\"\n [Title]=\"SearchTerm ? 'No matching attachments' : 'No attachments yet'\"\n [Message]=\"SearchTerm ? 'Try adjusting your search query or provider filter.' : (StorageAccounts.length === 0 ? 'No active file storage accounts are configured. Uploads are disabled until a storage account is configured.' : (EffectiveAllowUpload ? 'Upload or drop files above to link attachments to this record.' : 'No attachments are linked to this record.'))\">\n </mj-empty-state>\n } @else {\n <div class=\"mj-attachments-container\" [class.mj-attachments-grid-mode]=\"ViewMode === 'grid'\">\n @for (item of FilteredAttachments; track item.LinkID) {\n <div class=\"mj-attachment-card\" [class.mj-attachment-card--list]=\"ViewMode === 'list'\">\n <div class=\"mj-attachment-card-top\" (click)=\"AllowPreview ? PreviewAttachment(item) : OpenAttachmentRecord(item)\">\n <div class=\"mj-attachment-thumb\" [ngClass]=\"GetFileColorClass(item)\" [title]=\"'Preview ' + item.Name\">\n <i [class]=\"GetFileIcon(item)\"></i>\n </div>\n <div class=\"mj-attachment-info\">\n <div class=\"mj-attachment-name\" [title]=\"item.Name\">\n {{ item.Name }}\n </div>\n <div class=\"mj-attachment-meta\">\n @if (item.FileSize) {\n <span>{{ FormatSize(item.FileSize) }}</span>\n <span>•</span>\n }\n @if (item.CategoryName) {\n <span class=\"mj-attachment-cat-badge\">{{ item.CategoryName }}</span>\n <span>•</span>\n }\n <span>{{ item.ContentType || 'File' }}</span>\n </div>\n @if (item.ProviderName) {\n <div class=\"mj-attachment-provider-tag\" [style.--provider-color]=\"GetProviderBrandColor(item)\">\n <i [class]=\"GetProviderIcon(item)\"></i>\n <span>{{ item.ProviderName }}</span>\n </div>\n }\n @if (item.Description) {\n <div class=\"mj-attachment-description\" [title]=\"item.Description\">\n {{ item.Description }}\n </div>\n }\n </div>\n </div>\n\n <!-- Streamlined Action Toolbar (Preview + Download + Overflow Menu) -->\n <div class=\"mj-attachment-actions\" (click)=\"$event.stopPropagation()\">\n @if (AllowPreview) {\n <button type=\"button\" class=\"mj-attachment-action-btn\" (click)=\"PreviewAttachment(item)\" title=\"Quick preview\">\n <i class=\"fa-solid fa-eye\"></i>\n </button>\n }\n @if (AllowDownload) {\n <button type=\"button\" class=\"mj-attachment-action-btn\" (click)=\"DownloadAttachment(item)\" title=\"Download file\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n }\n\n <!-- Overflow Menu Trigger -->\n <div class=\"mj-attachment-menu-container\">\n <button\n type=\"button\"\n class=\"mj-attachment-action-btn mj-attachment-action-btn--more\"\n [class.mj-attachment-action-btn--active]=\"ActiveMenuLinkID === item.LinkID\"\n (click)=\"ToggleItemMenu($event, item)\"\n title=\"More actions\"\n [attr.aria-expanded]=\"ActiveMenuLinkID === item.LinkID\"\n >\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n\n <!-- Dropdown Menu -->\n @if (ActiveMenuLinkID === item.LinkID) {\n <div class=\"mj-attachment-dropdown\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"OpenAttachmentRecord(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n <span>Open in Workspace</span>\n </button>\n @if (AllowEditMetadata && UserCanUpdateFile) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"OpenEditMetadata(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-pen\"></i>\n <span>Edit Details</span>\n </button>\n }\n @if (AllowReplace && EffectiveAllowUpload) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item\" (click)=\"RequestReplace(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-arrow-right-arrow-left\"></i>\n <span>Replace File</span>\n </button>\n }\n @if (EffectiveAllowUnlink || EffectiveAllowDelete) {\n <div class=\"mj-attachment-dropdown-divider\"></div>\n }\n @if (EffectiveAllowUnlink) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item mj-attachment-dropdown-item--warning\" (click)=\"UnlinkAttachment(item); CloseItemMenu()\">\n <i class=\"fa-solid fa-link-slash\"></i>\n <span>Unlink from Record</span>\n </button>\n }\n @if (EffectiveAllowDelete) {\n <button type=\"button\" class=\"mj-attachment-dropdown-item mj-attachment-dropdown-item--danger\" (click)=\"DeleteAttachment(item, true); CloseItemMenu()\">\n <i class=\"fa-regular fa-trash-can\"></i>\n <span>Delete Completely</span>\n </button>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n }\n\n </div>\n\n <!-- ====================================================================\n EDIT ATTACHMENT DETAILS SUB-PANEL (Slide-in inside slide-panel)\n ==================================================================== -->\n @if (EditMetadataModalOpen && EditMetadataItem) {\n <div class=\"mj-record-attachments-subpanel\">\n <!-- Sub-Panel Top Navigation Bar -->\n <div class=\"mj-subpanel-header\">\n <button type=\"button\" class=\"mj-subpanel-back-btn\" (click)=\"CloseEditMetadataModal()\" title=\"Back to attachments\">\n <i class=\"fa-solid fa-arrow-left\"></i>\n <span>Back</span>\n </button>\n <div class=\"mj-subpanel-title\">\n <i class=\"fa-solid fa-pen-to-square\"></i>\n <span>Attachment Details</span>\n </div>\n <button type=\"button\" class=\"mj-subpanel-close-btn\" (click)=\"CloseEditMetadataModal()\" title=\"Close details\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Sub-Panel Body -->\n <div class=\"mj-subpanel-body\">\n <!-- File Info Summary Hero -->\n <div class=\"mj-subpanel-hero\">\n <div class=\"mj-subpanel-icon\" [ngClass]=\"GetFileColorClass(EditMetadataItem)\">\n <i [class]=\"GetFileIcon(EditMetadataItem)\"></i>\n </div>\n <div class=\"mj-subpanel-hero-info\">\n <div class=\"mj-subpanel-hero-name\" [title]=\"EditMetadataItem.Name\">{{ EditMetadataItem.Name }}</div>\n <div class=\"mj-subpanel-hero-meta\">\n <span>{{ FormatSize(EditMetadataItem.FileSize) }}</span>\n <span class=\"mj-subpanel-dot\">•</span>\n <span>{{ EditMetadataItem.ContentType || 'Document' }}</span>\n @if (EditMetadataItem.ProviderName) {\n <span class=\"mj-subpanel-dot\">•</span>\n <span class=\"mj-subpanel-storage-tag\">{{ EditMetadataItem.ProviderName }}</span>\n }\n </div>\n </div>\n </div>\n\n <!-- Edit Form -->\n <div class=\"mj-subpanel-form\">\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">File Name</label>\n <input\n type=\"text\"\n class=\"mj-form-input\"\n [(ngModel)]=\"EditMetadataName\"\n placeholder=\"e.g. document.pdf\"\n (keydown.enter)=\"EditMetadataName.trim() && !IsLoading && SaveEditMetadata()\"\n />\n <div class=\"mj-form-hint\">Changing the name updates the display title across all record views.</div>\n </div>\n\n <div class=\"mj-form-group\">\n <label class=\"mj-form-label\">Description (Optional)</label>\n <textarea\n class=\"mj-form-textarea\"\n [(ngModel)]=\"EditMetadataDescription\"\n rows=\"4\"\n placeholder=\"Add notes, tags, or context about this attachment...\"\n ></textarea>\n </div>\n\n <!-- Metadata Properties Card -->\n <div class=\"mj-subpanel-details-card\">\n <div class=\"mj-details-card-title\">Storage Information</div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Storage Account:</span>\n <span class=\"mj-details-value\">{{ EditMetadataItem.ProviderName || 'Default Storage' }}</span>\n </div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Attached On:</span>\n <span class=\"mj-details-value\">{{ EditMetadataItem.CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"mj-details-row\">\n <span class=\"mj-details-label\">Status:</span>\n <span class=\"mj-details-badge\">{{ EditMetadataItem.Status || 'Active' }}</span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Sub-Panel Footer Actions -->\n <div class=\"mj-subpanel-footer\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"CloseEditMetadataModal()\">\n Cancel\n </button>\n <div class=\"mj-subpanel-footer-right\">\n @if (AllowDownload) {\n <button\n type=\"button\"\n class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-secondary\"\n (click)=\"DownloadAttachment(EditMetadataItem)\"\n title=\"Open in new tab\"\n >\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n <span>Open</span>\n </button>\n }\n <button\n type=\"button\"\n class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-primary\"\n (click)=\"SaveEditMetadata()\"\n [disabled]=\"!EditMetadataName.trim() || IsLoading\"\n >\n <i class=\"fa-solid fa-check\"></i>\n <span>{{ IsLoading ? 'Saving...' : 'Save Changes' }}</span>\n </button>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n</mj-slide-panel>\n\n<!-- ====================================================================\n RICH MEDIA PREVIEW MODAL\n ==================================================================== -->\n@if (PreviewModalOpen && ActivePreviewItem) {\n <div class=\"mj-preview-modal-backdrop\" (click)=\"ClosePreviewModal()\">\n <div class=\"mj-preview-dialog\" (click)=\"$event.stopPropagation()\">\n \n <div class=\"mj-preview-dialog-header\">\n <div class=\"mj-preview-dialog-title\">\n <i [class]=\"GetFileIcon(ActivePreviewItem)\" [ngClass]=\"GetFileColorClass(ActivePreviewItem)\"></i>\n <span>{{ ActivePreviewItem.Name }}</span>\n </div>\n <button type=\"button\" class=\"mj-preview-close-btn\" (click)=\"ClosePreviewModal()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"mj-preview-dialog-body\">\n @if (IsLoadingPreview || !IsMediaLoaded) {\n <div class=\"mj-preview-loading-overlay\">\n <mj-loading [text]=\"'Loading ' + (ActivePreviewItem.Name || 'preview') + '...'\"></mj-loading>\n </div>\n }\n\n @switch (GetMediaType(ActivePreviewItem)) {\n @case ('image') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-image-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <img [src]=\"ActivePreviewUrl\" [alt]=\"ActivePreviewItem.Name\" (load)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\" />\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-image mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Preview could not be loaded</div>\n </div>\n }\n }\n @case ('pdf') {\n @if (ActivePreviewSafeUrl) {\n <div class=\"mj-preview-frame-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <iframe [src]=\"ActivePreviewSafeUrl\" title=\"PDF Preview\" (load)=\"OnPreviewMediaLoaded()\"></iframe>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-pdf mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">PDF preview could not be loaded</div>\n </div>\n }\n }\n @case ('video') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-media-container\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <video controls autoplay [src]=\"ActivePreviewUrl\" (loadeddata)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\"></video>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-video mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Video preview could not be loaded</div>\n </div>\n }\n }\n @case ('audio') {\n @if (ActivePreviewUrl) {\n <div class=\"mj-preview-media-container mj-preview-audio-box\" [class.mj-preview-content--hidden]=\"!IsMediaLoaded\">\n <div class=\"mj-preview-audio-icon\"><i class=\"fa-solid fa-headphones\"></i></div>\n <audio controls [src]=\"ActivePreviewUrl\" (loadeddata)=\"OnPreviewMediaLoaded()\" (error)=\"OnPreviewMediaLoaded()\"></audio>\n </div>\n } @else {\n <div class=\"mj-preview-generic-box\">\n <i class=\"fa-solid fa-file-audio mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">Audio preview could not be loaded</div>\n </div>\n }\n }\n @case ('text') {\n <div class=\"mj-preview-text-container\">\n <pre><code>{{ ActivePreviewTextContent || 'Loading content...' }}</code></pre>\n </div>\n }\n @default {\n <div class=\"mj-preview-generic-box\">\n <i [class]=\"GetFileIcon(ActivePreviewItem)\" class=\"mj-preview-generic-icon\"></i>\n <div class=\"mj-preview-generic-title\">{{ ActivePreviewItem.Name }}</div>\n <div class=\"mj-preview-generic-sub\">{{ ActivePreviewItem.ContentType || 'Document' }} • {{ FormatSize(ActivePreviewItem.FileSize) }}</div>\n <div class=\"mj-preview-generic-desc\">{{ ActivePreviewItem.Description || 'Preview not available for this binary file format.' }}</div>\n </div>\n }\n }\n </div>\n\n <div class=\"mj-preview-dialog-footer\">\n <div class=\"mj-preview-footer-meta\">\n @if (ActivePreviewItem.ProviderName) {\n <span>Storage: <strong>{{ ActivePreviewItem.ProviderName }}</strong></span>\n }\n </div>\n <div class=\"mj-preview-footer-actions\">\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-flat\" (click)=\"ClosePreviewModal()\">Close</button>\n @if (AllowDownload) {\n <button type=\"button\" class=\"mj-attach-btn mj-attach-btn-sm mj-attach-btn-primary\" (click)=\"DownloadAttachment(ActivePreviewItem)\">\n <i class=\"fa-solid fa-download\"></i>\n <span>Download</span>\n </button>\n }\n </div>\n </div>\n\n </div>\n </div>\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-file-storage",
|
|
3
|
-
"version": "6.2.0-edge.
|
|
3
|
+
"version": "6.2.0-edge.5",
|
|
4
4
|
"description": "MemberJunction: Angular components for managing files, and related components.",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@angular/compiler": "21.2.22",
|
|
25
25
|
"@angular/compiler-cli": "21.2.22",
|
|
26
|
-
"@memberjunction/ng-test-utils": "6.2.0-edge.
|
|
26
|
+
"@memberjunction/ng-test-utils": "6.2.0-edge.5",
|
|
27
27
|
"vitest": "^4.0.18"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
@@ -33,17 +33,17 @@
|
|
|
33
33
|
"@angular/platform-browser": "^21.2.22"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@memberjunction/core": "6.2.0-edge.
|
|
37
|
-
"@memberjunction/core-entities": "6.2.0-edge.
|
|
38
|
-
"@memberjunction/global": "6.2.0-edge.
|
|
39
|
-
"@memberjunction/graphql-dataprovider": "6.2.0-edge.
|
|
40
|
-
"@memberjunction/ng-base-types": "6.2.0-edge.
|
|
41
|
-
"@memberjunction/ng-container-directives": "6.2.0-edge.
|
|
42
|
-
"@memberjunction/ng-credentials": "6.2.0-edge.
|
|
43
|
-
"@memberjunction/ng-notifications": "6.2.0-edge.
|
|
44
|
-
"@memberjunction/ng-shared": "6.2.0-edge.
|
|
45
|
-
"@memberjunction/ng-shared-generic": "6.2.0-edge.
|
|
46
|
-
"@memberjunction/ng-ui-components": "6.2.0-edge.
|
|
36
|
+
"@memberjunction/core": "6.2.0-edge.5",
|
|
37
|
+
"@memberjunction/core-entities": "6.2.0-edge.5",
|
|
38
|
+
"@memberjunction/global": "6.2.0-edge.5",
|
|
39
|
+
"@memberjunction/graphql-dataprovider": "6.2.0-edge.5",
|
|
40
|
+
"@memberjunction/ng-base-types": "6.2.0-edge.5",
|
|
41
|
+
"@memberjunction/ng-container-directives": "6.2.0-edge.5",
|
|
42
|
+
"@memberjunction/ng-credentials": "6.2.0-edge.5",
|
|
43
|
+
"@memberjunction/ng-notifications": "6.2.0-edge.5",
|
|
44
|
+
"@memberjunction/ng-shared": "6.2.0-edge.5",
|
|
45
|
+
"@memberjunction/ng-shared-generic": "6.2.0-edge.5",
|
|
46
|
+
"@memberjunction/ng-ui-components": "6.2.0-edge.5",
|
|
47
47
|
"ag-grid-angular": "^35.0.1",
|
|
48
48
|
"ag-grid-community": "^35.0.1",
|
|
49
49
|
"tslib": "^2.8.1",
|