@memberjunction/ng-file-storage 6.1.4 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/admin/storage-admin-dialog.component.d.ts +1 -1
- package/dist/lib/admin/storage-admin-dialog.component.js +2 -2
- package/dist/lib/admin/storage-admin-dialog.component.js.map +1 -1
- package/dist/lib/category-tree/category-tree.d.ts +83 -9
- package/dist/lib/category-tree/category-tree.d.ts.map +1 -1
- package/dist/lib/category-tree/category-tree.js +192 -50
- package/dist/lib/category-tree/category-tree.js.map +1 -1
- package/dist/lib/file-browser/file-browser.component.d.ts +30 -4
- package/dist/lib/file-browser/file-browser.component.d.ts.map +1 -1
- package/dist/lib/file-browser/file-browser.component.js +68 -16
- package/dist/lib/file-browser/file-browser.component.js.map +1 -1
- package/dist/lib/file-browser/file-grid.component.d.ts +404 -58
- package/dist/lib/file-browser/file-grid.component.d.ts.map +1 -1
- package/dist/lib/file-browser/file-grid.component.js +1040 -396
- package/dist/lib/file-browser/file-grid.component.js.map +1 -1
- package/dist/lib/file-browser/folder-tree.component.d.ts +65 -9
- package/dist/lib/file-browser/folder-tree.component.d.ts.map +1 -1
- package/dist/lib/file-browser/folder-tree.component.js +166 -58
- package/dist/lib/file-browser/folder-tree.component.js.map +1 -1
- package/dist/lib/file-browser/storage-providers-list.component.d.ts +55 -7
- package/dist/lib/file-browser/storage-providers-list.component.d.ts.map +1 -1
- package/dist/lib/file-browser/storage-providers-list.component.js +124 -34
- package/dist/lib/file-browser/storage-providers-list.component.js.map +1 -1
- package/dist/lib/file-upload/file-upload.d.ts +22 -2
- package/dist/lib/file-upload/file-upload.d.ts.map +1 -1
- package/dist/lib/file-upload/file-upload.js +40 -10
- package/dist/lib/file-upload/file-upload.js.map +1 -1
- package/dist/lib/files-grid/files-grid.d.ts +28 -4
- package/dist/lib/files-grid/files-grid.d.ts.map +1 -1
- package/dist/lib/files-grid/files-grid.js +71 -23
- package/dist/lib/files-grid/files-grid.js.map +1 -1
- package/dist/lib/record-attachments/record-attachments.component.d.ts +15 -7
- package/dist/lib/record-attachments/record-attachments.component.d.ts.map +1 -1
- package/dist/lib/record-attachments/record-attachments.component.js +34 -18
- package/dist/lib/record-attachments/record-attachments.component.js.map +1 -1
- package/package.json +13 -13
|
@@ -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 public isLoading: boolean = false;\n public editFile: MJFileEntity | undefined;\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 /**\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 /**\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 /**\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 /**\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 /**\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 /**\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 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"]}
|
|
@@ -68,8 +68,16 @@ export declare class RecordAttachmentsComponent extends BaseAngularComponent imp
|
|
|
68
68
|
AfterPreview: EventEmitter<AfterPreviewAttachmentEventArgs>;
|
|
69
69
|
BeforeReplace: EventEmitter<BeforeReplaceAttachmentEventArgs>;
|
|
70
70
|
AfterReplace: EventEmitter<AfterReplaceAttachmentEventArgs>;
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
FileInputRef?: ElementRef<HTMLInputElement>;
|
|
72
|
+
/** @deprecated Use {@link FileInputRef}. */
|
|
73
|
+
get fileInputRef(): ElementRef<HTMLInputElement> | undefined;
|
|
74
|
+
/** @deprecated Use {@link FileInputRef}. */
|
|
75
|
+
set fileInputRef(value: ElementRef<HTMLInputElement> | undefined);
|
|
76
|
+
ReplaceInputRef?: ElementRef<HTMLInputElement>;
|
|
77
|
+
/** @deprecated Use {@link ReplaceInputRef}. */
|
|
78
|
+
get replaceInputRef(): ElementRef<HTMLInputElement> | undefined;
|
|
79
|
+
/** @deprecated Use {@link ReplaceInputRef}. */
|
|
80
|
+
set replaceInputRef(value: ElementRef<HTMLInputElement> | undefined);
|
|
73
81
|
IsLoading: boolean;
|
|
74
82
|
IsUploading: boolean;
|
|
75
83
|
UploadProgressPercent: number;
|
|
@@ -107,10 +115,10 @@ export declare class RecordAttachmentsComponent extends BaseAngularComponent imp
|
|
|
107
115
|
ActiveMenuLinkID: string | null;
|
|
108
116
|
ngOnInit(): Promise<void>;
|
|
109
117
|
ngOnChanges(changes: SimpleChanges): Promise<void>;
|
|
110
|
-
private
|
|
118
|
+
private restoreUserPreferences;
|
|
111
119
|
OnWidthChanged(width: number): void;
|
|
112
120
|
SetViewMode(mode: AttachmentViewMode): void;
|
|
113
|
-
private
|
|
121
|
+
private checkStorageAndPermissions;
|
|
114
122
|
get EffectiveEntityID(): string | null;
|
|
115
123
|
get EffectiveRecordID(): string | null;
|
|
116
124
|
get EffectiveAllowUpload(): boolean;
|
|
@@ -141,7 +149,7 @@ export declare class RecordAttachmentsComponent extends BaseAngularComponent imp
|
|
|
141
149
|
* Prefers the inline streaming endpoint (/media/:fileId?token=...) so the browser renders
|
|
142
150
|
* the document/media natively without triggering forced attachment downloads or Save As dialogs.
|
|
143
151
|
*/
|
|
144
|
-
private
|
|
152
|
+
private getInlineFileUrl;
|
|
145
153
|
/**
|
|
146
154
|
* Opens the attachment in a new browser tab for direct viewing.
|
|
147
155
|
*/
|
|
@@ -184,8 +192,8 @@ export declare class RecordAttachmentsComponent extends BaseAngularComponent imp
|
|
|
184
192
|
GetProviderIcon(item: RecordAttachmentItem): string;
|
|
185
193
|
GetProviderBrandColor(item: RecordAttachmentItem): string | undefined;
|
|
186
194
|
GetFallbackProviderIcon(providerName?: string | null): string;
|
|
187
|
-
private
|
|
188
|
-
private
|
|
195
|
+
private providerSupportsDirectUpload;
|
|
196
|
+
private triggerBrowserDownload;
|
|
189
197
|
/**
|
|
190
198
|
* Performs an authenticated direct binary upload of a raw File/Blob to a pre-authenticated cloud storage URL.
|
|
191
199
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record-attachments.component.d.ts","sourceRoot":"","sources":["../../../src/lib/record-attachments/record-attachments.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EACZ,MAAM,EACN,SAAS,EACT,aAAa,EAIb,UAAU,EAEX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAgB,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAyB,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAGL,2BAA2B,EAG3B,0BAA0B,EAE3B,MAAM,+BAA+B,CAAC;AAMvC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EAGpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,+BAA+B,EAC/B,8BAA8B,EAC9B,+BAA+B,EAC/B,8BAA8B,EAC9B,+BAA+B,EAC/B,8BAA8B,EAC9B,iCAAiC,EACjC,gCAAgC,EAChC,gCAAgC,EAChC,+BAA+B,EAC/B,gCAAgC,EAChC,+BAA+B,EAChC,MAAM,6BAA6B,CAAC;;AAwIrC;;;;;GAKG;AACH,qBAMa,0BAA2B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAC/F,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,SAAS,CAAwB;IAEzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAgC;IACtE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAmC;IAM7E,4CAA4C;IACnC,MAAM,CAAC,EAAE,UAAU,CAAC;IAE7B,wDAAwD;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,wDAAwD;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,2EAA2E;IAClE,WAAW,EAAE,oBAAoB,EAAE,CAAM;IAElD,mCAAmC;IAC1B,MAAM,CAAC,EAAE,uBAAuB,CAAC;IAE1C,yCAAyC;IAChC,OAAO,EAAE,OAAO,CAAQ;IAEjC,2CAA2C;IAClC,SAAS,EAAE,OAAO,CAAQ;IAEnC,sDAAsD;IAC7C,OAAO,EAAE,MAAM,CAAK;IAE7B,gCAAgC;IACvB,UAAU,EAAE,MAAM,CAAO;IAElC,4CAA4C;IACnC,aAAa,EAAE,MAAM,CAAQ;IAEtC,kBAAkB;IACT,KAAK,EAAE,MAAM,CAAiB;IAEvC,kCAAkC;IACzB,WAAW,EAAE,OAAO,CAAQ;IAC5B,WAAW,EAAE,OAAO,CAAQ;IAC5B,WAAW,EAAE,OAAO,CAAQ;IAC5B,aAAa,EAAE,OAAO,CAAQ;IAC9B,YAAY,EAAE,OAAO,CAAQ;IAC7B,YAAY,EAAE,OAAO,CAAQ;IAC7B,iBAAiB,EAAE,OAAO,CAAQ;IAE3C,kBAAkB;IACT,kBAAkB,EAAE,OAAO,CAAQ;IACnC,UAAU,EAAE,OAAO,CAAQ;IAC3B,QAAQ,EAAE,kBAAkB,CAAU;IAMrC,WAAW,qBAA4B;IACvC,YAAY,uBAA8B;IAC1C,sBAAsB,uBAA8B;IACpD,eAAe,mCAA0C;IAEzD,YAAY,gDAAuD;IACnE,WAAW,+CAAsD;IAEjE,YAAY,gDAAuD;IACnE,WAAW,+CAAsD;IAEjE,YAAY,gDAAuD;IACnE,WAAW,+CAAsD;IAEjE,cAAc,kDAAyD;IACvE,aAAa,iDAAwD;IAErE,aAAa,iDAAwD;IACrE,YAAY,gDAAuD;IAEnE,aAAa,iDAAwD;IACrE,YAAY,gDAAuD;IAMlD,YAAY,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC;
|
|
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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"}
|
|
@@ -948,8 +948,24 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
948
948
|
// ────────────────────────────────────────────────────────────────────
|
|
949
949
|
// Internal State
|
|
950
950
|
// ────────────────────────────────────────────────────────────────────
|
|
951
|
-
|
|
952
|
-
|
|
951
|
+
FileInputRef;
|
|
952
|
+
/** @deprecated Use {@link FileInputRef}. */
|
|
953
|
+
get fileInputRef() {
|
|
954
|
+
return this.FileInputRef;
|
|
955
|
+
}
|
|
956
|
+
/** @deprecated Use {@link FileInputRef}. */
|
|
957
|
+
set fileInputRef(value) {
|
|
958
|
+
this.FileInputRef = value;
|
|
959
|
+
}
|
|
960
|
+
ReplaceInputRef;
|
|
961
|
+
/** @deprecated Use {@link ReplaceInputRef}. */
|
|
962
|
+
get replaceInputRef() {
|
|
963
|
+
return this.ReplaceInputRef;
|
|
964
|
+
}
|
|
965
|
+
/** @deprecated Use {@link ReplaceInputRef}. */
|
|
966
|
+
set replaceInputRef(value) {
|
|
967
|
+
this.ReplaceInputRef = value;
|
|
968
|
+
}
|
|
953
969
|
IsLoading = false;
|
|
954
970
|
IsUploading = false;
|
|
955
971
|
UploadProgressPercent = 0;
|
|
@@ -989,8 +1005,8 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
989
1005
|
// Lifecycle
|
|
990
1006
|
// ────────────────────────────────────────────────────────────────────
|
|
991
1007
|
async ngOnInit() {
|
|
992
|
-
this.
|
|
993
|
-
await this.
|
|
1008
|
+
this.restoreUserPreferences();
|
|
1009
|
+
await this.checkStorageAndPermissions();
|
|
994
1010
|
if (this.Attachments.length === 0 && (this.Record || (this.EntityID && this.RecordID))) {
|
|
995
1011
|
await this.Refresh();
|
|
996
1012
|
}
|
|
@@ -1005,7 +1021,7 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
1005
1021
|
// ────────────────────────────────────────────────────────────────────
|
|
1006
1022
|
// Preferences & Permissions
|
|
1007
1023
|
// ────────────────────────────────────────────────────────────────────
|
|
1008
|
-
|
|
1024
|
+
restoreUserPreferences() {
|
|
1009
1025
|
const savedWidth = UserInfoEngine.Instance.GetSetting(RecordAttachmentsComponent.PREF_WIDTH_KEY);
|
|
1010
1026
|
if (savedWidth && !this.WidthPx) {
|
|
1011
1027
|
this.WidthPx = parseInt(savedWidth, 10) || 520;
|
|
@@ -1029,7 +1045,7 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
1029
1045
|
this.ViewModeChanged.emit(mode);
|
|
1030
1046
|
this.cdr.markForCheck();
|
|
1031
1047
|
}
|
|
1032
|
-
async
|
|
1048
|
+
async checkStorageAndPermissions() {
|
|
1033
1049
|
try {
|
|
1034
1050
|
await FileStorageEngineBase.Instance.Config(false);
|
|
1035
1051
|
this.ActiveProviders = FileStorageEngineBase.Instance.Providers.filter((p) => p.IsActive !== false);
|
|
@@ -1150,7 +1166,7 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
1150
1166
|
this.IsLoading = true;
|
|
1151
1167
|
this.cdr.markForCheck();
|
|
1152
1168
|
try {
|
|
1153
|
-
await this.
|
|
1169
|
+
await this.checkStorageAndPermissions();
|
|
1154
1170
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
1155
1171
|
const linksResult = await rv.RunView({
|
|
1156
1172
|
EntityName: 'MJ: File Entity Record Links',
|
|
@@ -1289,7 +1305,7 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
1289
1305
|
// ─────────────────────────────────────────────────────────────────────
|
|
1290
1306
|
// 1. Try Direct Binary Upload via Pre-Authenticated URL (for S3, Azure Blob, GCS)
|
|
1291
1307
|
// ─────────────────────────────────────────────────────────────────────
|
|
1292
|
-
const supportsDirectPreAuth = this.
|
|
1308
|
+
const supportsDirectPreAuth = this.providerSupportsDirectUpload(targetAccount?.provider);
|
|
1293
1309
|
if (supportsDirectPreAuth) {
|
|
1294
1310
|
try {
|
|
1295
1311
|
console.log(`[RecordAttachmentsComponent] [${fileIndex}/${files.length}] Requesting pre-auth upload URL for '${file.name}' on account '${targetAccountID}'...`);
|
|
@@ -1607,7 +1623,7 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
1607
1623
|
* Prefers the inline streaming endpoint (/media/:fileId?token=...) so the browser renders
|
|
1608
1624
|
* the document/media natively without triggering forced attachment downloads or Save As dialogs.
|
|
1609
1625
|
*/
|
|
1610
|
-
async
|
|
1626
|
+
async getInlineFileUrl(fileId) {
|
|
1611
1627
|
try {
|
|
1612
1628
|
const mediaResult = await GraphQLDataProvider.ExecuteGQL(CreateMediaAccessTokenMutation, { fileId });
|
|
1613
1629
|
const parsedMedia = CreateMediaAccessTokenMutationSchema.safeParse(mediaResult);
|
|
@@ -1639,7 +1655,7 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
1639
1655
|
if (beforeEvent.Cancel)
|
|
1640
1656
|
return false;
|
|
1641
1657
|
try {
|
|
1642
|
-
const url = await this.
|
|
1658
|
+
const url = await this.getInlineFileUrl(attachment.FileID);
|
|
1643
1659
|
if (url) {
|
|
1644
1660
|
// Open directly in a new tab so the browser displays the document
|
|
1645
1661
|
window.open(url, '_blank', 'noopener,noreferrer');
|
|
@@ -1674,7 +1690,7 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
1674
1690
|
this.ActivePreviewTextContent = null;
|
|
1675
1691
|
this.cdr.markForCheck();
|
|
1676
1692
|
try {
|
|
1677
|
-
const url = await this.
|
|
1693
|
+
const url = await this.getInlineFileUrl(attachment.FileID);
|
|
1678
1694
|
if (url) {
|
|
1679
1695
|
this.ActivePreviewUrl = url;
|
|
1680
1696
|
this.ActivePreviewSafeUrl = this.sanitizer.bypassSecurityTrustResourceUrl(url);
|
|
@@ -1746,7 +1762,7 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
1746
1762
|
*/
|
|
1747
1763
|
RequestReplace(attachment) {
|
|
1748
1764
|
this.pendingReplaceItem = attachment;
|
|
1749
|
-
this.
|
|
1765
|
+
this.ReplaceInputRef?.nativeElement.click();
|
|
1750
1766
|
}
|
|
1751
1767
|
/**
|
|
1752
1768
|
* Replaces an existing attachment with a newly uploaded file.
|
|
@@ -1960,7 +1976,7 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
1960
1976
|
return 'fa-brands fa-microsoft';
|
|
1961
1977
|
return 'fa-solid fa-cloud';
|
|
1962
1978
|
}
|
|
1963
|
-
|
|
1979
|
+
providerSupportsDirectUpload(provider) {
|
|
1964
1980
|
if (!provider)
|
|
1965
1981
|
return false;
|
|
1966
1982
|
const key = (provider.ServerDriverKey || '').toLowerCase();
|
|
@@ -1973,7 +1989,7 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
1973
1989
|
name.includes('azure') ||
|
|
1974
1990
|
name.includes('google cloud'));
|
|
1975
1991
|
}
|
|
1976
|
-
|
|
1992
|
+
triggerBrowserDownload(url, fileName) {
|
|
1977
1993
|
const link = document.createElement('a');
|
|
1978
1994
|
link.href = url;
|
|
1979
1995
|
link.download = fileName;
|
|
@@ -2105,8 +2121,8 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
2105
2121
|
i0.ɵɵviewQuery(_c0, 5)(_c1, 5);
|
|
2106
2122
|
} if (rf & 2) {
|
|
2107
2123
|
let _t;
|
|
2108
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
2109
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
2124
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.FileInputRef = _t.first);
|
|
2125
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ReplaceInputRef = _t.first);
|
|
2110
2126
|
} }, hostBindings: function RecordAttachmentsComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
2111
2127
|
i0.ɵɵlistener("click", function RecordAttachmentsComponent_click_HostBindingHandler() { return ctx.OnDocumentClick(); }, i0.ɵɵresolveDocument)("keydown.escape", function RecordAttachmentsComponent_keydown_escape_HostBindingHandler() { return ctx.OnEscapePress(); }, i0.ɵɵresolveDocument);
|
|
2112
2128
|
} }, inputs: { Record: "Record", EntityID: "EntityID", RecordID: "RecordID", Attachments: "Attachments", Config: "Config", Visible: "Visible", Resizable: "Resizable", WidthPx: "WidthPx", MinWidthPx: "MinWidthPx", MaxWidthRatio: "MaxWidthRatio", Title: "Title", AllowUpload: "AllowUpload", AllowDelete: "AllowDelete", AllowUnlink: "AllowUnlink", AllowDownload: "AllowDownload", AllowPreview: "AllowPreview", AllowReplace: "AllowReplace", AllowEditMetadata: "AllowEditMetadata", ShowProviderFilter: "ShowProviderFilter", ShowSearch: "ShowSearch", ViewMode: "ViewMode" }, outputs: { PanelClosed: "PanelClosed", WidthChanged: "WidthChanged", AttachmentCountChanged: "AttachmentCountChanged", ViewModeChanged: "ViewModeChanged", BeforeUpload: "BeforeUpload", AfterUpload: "AfterUpload", BeforeDelete: "BeforeDelete", AfterDelete: "AfterDelete", BeforeUnlink: "BeforeUnlink", AfterUnlink: "AfterUnlink", BeforeDownload: "BeforeDownload", AfterDownload: "AfterDownload", BeforePreview: "BeforePreview", AfterPreview: "AfterPreview", BeforeReplace: "BeforeReplace", AfterReplace: "AfterReplace" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 29, vars: 25, consts: [["replaceInputRef", ""], ["fileInputRef", ""], [3, "Closed", "WidthChanged", "Mode", "Title", "Visible", "Resizable", "MinWidthPx", "MaxWidthRatio", "WidthPx"], [1, "mj-record-attachments-wrapper"], [1, "mj-record-attachments-meta-strip"], [1, "mj-record-attachments-summary"], [1, "mj-record-attachments-badge"], [1, "mj-record-attachments-top-actions"], ["type", "button", "title", "Refresh attachments", 1, "mj-attach-btn", "mj-attach-btn-sm", "mj-attach-btn-flat", 3, "click", "disabled"], [1, "fa-solid", "fa-rotate-right"], [1, "mj-record-attachments-controls-bar"], [1, "mj-provider-pills"], [1, "mj-view-controls"], ["type", "button", "title", "Card Grid View", 1, "mj-view-toggle-btn", 3, "click"], [1, "fa-solid", "fa-grip"], ["type", "button", "title", "Detailed List View", 1, "mj-view-toggle-btn", 3, "click"], [1, "fa-solid", "fa-list"], [1, "mj-record-attachments-content"], [1, "mj-record-attachments-alert"], [1, "mj-upload-progress-banner"], [1, "mj-upload-dropzone", 3, "disabled"], [1, "mj-attachments-search-bar"], ["type", "file", 2, "display", "none", 3, "change"], [1, "mj-record-attachments-loading"], ["Icon", "fa-solid fa-paperclip", 3, "Title", "Message"], [1, "mj-attachments-container", 3, "mj-attachments-grid-mode"], [1, "mj-record-attachments-subpanel"], [1, "mj-preview-modal-backdrop"], ["type", "button", 1, "mj-provider-pill", 3, "click"], [1, "mj-pill-count"], ["type", "button", 1, "mj-provider-pill", 3, "active"], ["Type", "warning", "Title", "No Active Storage Providers Configured", "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."], [1, "mj-upload-progress-header"], [1, "mj-upload-progress-info"], [1, "fa-solid", "fa-cloud-arrow-up", "fa-bounce", "mj-upload-progress-icon"], [1, "mj-upload-progress-text"], [1, "mj-upload-progress-pct"], [1, "mj-upload-progress-track"], [1, "mj-upload-progress-bar"], [1, "mj-upload-dropzone", 3, "dragover", "drop", "click"], [1, "fa-solid", "fa-cloud-arrow-up", "mj-upload-dropzone-icon"], [1, "mj-upload-dropzone-title"], [1, "mj-upload-dropzone-link"], [1, "mj-upload-dropzone-subtitle"], [1, "mj-upload-storage-row"], ["type", "file", "multiple", "", 2, "display", "none", 3, "change"], [1, "mj-upload-storage-row", 3, "click"], [1, "mj-upload-storage-select", 3, "ngModelChange", "ngModel", "disabled"], [3, "value"], [1, "fa-solid", "fa-magnifying-glass"], ["type", "text", "placeholder", "Filter attachments by name, category, extension...", 3, "ngModelChange", "ngModel"], ["type", "button", 1, "mj-clear-search-btn"], ["type", "button", 1, "mj-clear-search-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], ["text", "Loading attachments..."], [1, "mj-attachments-container"], [1, "mj-attachment-card", 3, "mj-attachment-card--list"], [1, "mj-attachment-card"], [1, "mj-attachment-card-top", 3, "click"], [1, "mj-attachment-thumb", 3, "ngClass", "title"], [1, "mj-attachment-info"], [1, "mj-attachment-name", 3, "title"], [1, "mj-attachment-meta"], [1, "mj-attachment-provider-tag", 3, "--provider-color"], [1, "mj-attachment-description", 3, "title"], [1, "mj-attachment-actions", 3, "click"], ["type", "button", "title", "Quick preview", 1, "mj-attachment-action-btn"], ["type", "button", "title", "Download file", 1, "mj-attachment-action-btn"], [1, "mj-attachment-menu-container"], ["type", "button", "title", "More actions", 1, "mj-attachment-action-btn", "mj-attachment-action-btn--more", 3, "click"], [1, "fa-solid", "fa-ellipsis-vertical"], [1, "mj-attachment-dropdown"], [1, "mj-attachment-cat-badge"], [1, "mj-attachment-provider-tag"], ["type", "button", "title", "Quick preview", 1, "mj-attachment-action-btn", 3, "click"], [1, "fa-solid", "fa-eye"], ["type", "button", "title", "Download file", 1, "mj-attachment-action-btn", 3, "click"], [1, "fa-solid", "fa-download"], [1, "mj-attachment-dropdown", 3, "click"], ["type", "button", 1, "mj-attachment-dropdown-item", 3, "click"], [1, "fa-solid", "fa-arrow-up-right-from-square"], ["type", "button", 1, "mj-attachment-dropdown-item"], [1, "mj-attachment-dropdown-divider"], ["type", "button", 1, "mj-attachment-dropdown-item", "mj-attachment-dropdown-item--warning"], ["type", "button", 1, "mj-attachment-dropdown-item", "mj-attachment-dropdown-item--danger"], [1, "fa-solid", "fa-pen"], [1, "fa-solid", "fa-arrow-right-arrow-left"], ["type", "button", 1, "mj-attachment-dropdown-item", "mj-attachment-dropdown-item--warning", 3, "click"], [1, "fa-solid", "fa-link-slash"], ["type", "button", 1, "mj-attachment-dropdown-item", "mj-attachment-dropdown-item--danger", 3, "click"], [1, "fa-regular", "fa-trash-can"], [1, "mj-subpanel-header"], ["type", "button", "title", "Back to attachments", 1, "mj-subpanel-back-btn", 3, "click"], [1, "fa-solid", "fa-arrow-left"], [1, "mj-subpanel-title"], [1, "fa-solid", "fa-pen-to-square"], ["type", "button", "title", "Close details", 1, "mj-subpanel-close-btn", 3, "click"], [1, "mj-subpanel-body"], [1, "mj-subpanel-hero"], [1, "mj-subpanel-icon", 3, "ngClass"], [1, "mj-subpanel-hero-info"], [1, "mj-subpanel-hero-name", 3, "title"], [1, "mj-subpanel-hero-meta"], [1, "mj-subpanel-dot"], [1, "mj-subpanel-form"], [1, "mj-form-group"], [1, "mj-form-label"], ["type", "text", "placeholder", "e.g. document.pdf", 1, "mj-form-input", 3, "ngModelChange", "keydown.enter", "ngModel"], [1, "mj-form-hint"], ["rows", "4", "placeholder", "Add notes, tags, or context about this attachment...", 1, "mj-form-textarea", 3, "ngModelChange", "ngModel"], [1, "mj-subpanel-details-card"], [1, "mj-details-card-title"], [1, "mj-details-row"], [1, "mj-details-label"], [1, "mj-details-value"], [1, "mj-details-badge"], [1, "mj-subpanel-footer"], ["type", "button", 1, "mj-attach-btn", "mj-attach-btn-sm", "mj-attach-btn-flat", 3, "click"], [1, "mj-subpanel-footer-right"], ["type", "button", "title", "Open in new tab", 1, "mj-attach-btn", "mj-attach-btn-sm", "mj-attach-btn-secondary"], ["type", "button", 1, "mj-attach-btn", "mj-attach-btn-sm", "mj-attach-btn-primary", 3, "click", "disabled"], [1, "fa-solid", "fa-check"], [1, "mj-subpanel-storage-tag"], ["type", "button", "title", "Open in new tab", 1, "mj-attach-btn", "mj-attach-btn-sm", "mj-attach-btn-secondary", 3, "click"], [1, "mj-preview-modal-backdrop", 3, "click"], [1, "mj-preview-dialog", 3, "click"], [1, "mj-preview-dialog-header"], [1, "mj-preview-dialog-title"], [3, "ngClass"], ["type", "button", 1, "mj-preview-close-btn", 3, "click"], [1, "mj-preview-dialog-body"], [1, "mj-preview-loading-overlay"], [1, "mj-preview-text-container"], [1, "mj-preview-generic-box"], [1, "mj-preview-dialog-footer"], [1, "mj-preview-footer-meta"], [1, "mj-preview-footer-actions"], ["type", "button", 1, "mj-attach-btn", "mj-attach-btn-sm", "mj-attach-btn-primary"], [3, "text"], [1, "mj-preview-image-container", 3, "mj-preview-content--hidden"], [1, "mj-preview-image-container"], [3, "load", "error", "src", "alt"], [1, "fa-solid", "fa-file-image", "mj-preview-generic-icon"], [1, "mj-preview-generic-title"], [1, "mj-preview-generic-sub"], [1, "mj-preview-frame-container", 3, "mj-preview-content--hidden"], [1, "mj-preview-frame-container"], ["title", "PDF Preview", 3, "load", "src"], [1, "fa-solid", "fa-file-pdf", "mj-preview-generic-icon"], [1, "mj-preview-media-container", 3, "mj-preview-content--hidden"], [1, "mj-preview-media-container"], ["controls", "", "autoplay", "", 3, "loadeddata", "error", "src"], [1, "fa-solid", "fa-file-video", "mj-preview-generic-icon"], [1, "mj-preview-media-container", "mj-preview-audio-box", 3, "mj-preview-content--hidden"], [1, "mj-preview-media-container", "mj-preview-audio-box"], [1, "mj-preview-audio-icon"], [1, "fa-solid", "fa-headphones"], ["controls", "", 3, "loadeddata", "error", "src"], [1, "fa-solid", "fa-file-audio", "mj-preview-generic-icon"], [1, "mj-preview-generic-icon"], [1, "mj-preview-generic-desc"], ["type", "button", 1, "mj-attach-btn", "mj-attach-btn-sm", "mj-attach-btn-primary", 3, "click"]], template: function RecordAttachmentsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -2252,10 +2268,10 @@ export class RecordAttachmentsComponent extends BaseAngularComponent {
|
|
|
2252
2268
|
type: Output
|
|
2253
2269
|
}], AfterReplace: [{
|
|
2254
2270
|
type: Output
|
|
2255
|
-
}],
|
|
2271
|
+
}], FileInputRef: [{
|
|
2256
2272
|
type: ViewChild,
|
|
2257
2273
|
args: ['fileInputRef']
|
|
2258
|
-
}],
|
|
2274
|
+
}], ReplaceInputRef: [{
|
|
2259
2275
|
type: ViewChild,
|
|
2260
2276
|
args: ['replaceInputRef']
|
|
2261
2277
|
}], OnDocumentClick: [{
|