Angular components for managing file storage in MemberJunction applications, providing a complete file management system with category trees, file grids, upload with overwrite protection, and integration with MemberJunction’s pluggable storage providers.
The @memberjunction/ng-file-storage package provides three core components that together form a file management interface: a hierarchical category tree for organizing files, a Kendo Grid for browsing and managing files within categories, and an upload component with provider integration and overwrite protection. All file operations flow through MemberJunction’s entity system and storage provider abstraction, supporting Azure Blob Storage, AWS S3, and other backends.
flowchart TD
subgraph UI["File Management UI"]
CT[CategoryTreeComponent] --> FG[FilesGridComponent]
FG --> FU[FileUploadComponent]
end
subgraph Operations["File Operations"]
FU --> UPLOAD[Upload to Provider]
FG --> DOWNLOAD[Download via Signed URL]
FG --> DELETE[Delete with Confirmation]
FG --> EDIT[Edit Metadata]
CT --> CREATE[Create Category]
CT --> DND[Drag & Drop Reorganize]
end
subgraph Backend["MJ Integration"]
ENTITY[Entity Framework] --> GQL[GraphQL API]
GQL --> PROVIDER[Storage Provider]
PROVIDER --> AZURE[Azure Blob]
PROVIDER --> S3[AWS S3]
end
Operations --> Backend
style UI fill:#2d6a9f,stroke:#1a4971,color:#fff
style Operations fill:#7c5295,stroke:#563a6b,color:#fff
style Backend fill:#2d8659,stroke:#1a5c3a,color:#fff
npm install @memberjunction/ng-file-storage
Before using this package, ensure your MemberJunction database has:
File Storage Providers configured and active
File Categories entity permissions for users
Files entity permissions for users
GraphQL endpoints configured
import { FileStorageModule } from ' @memberjunction/ng-file-storage ' ;
imports: [FileStorageModule]
export class YourModule { }
< div style = " display: flex; height: 600px; " >
< div style = " width: 300px; border-right: 1px solid #ccc; " >
(categorySelected) = " selectedCategoryId = $event " >
</ mj-files-category-tree >
[CategoryID] = " selectedCategoryId " >
[CategoryID] = " selectedCategoryId "
(uploadStarted) = " onUploadStarted() "
(fileUpload) = " onFileUploaded($event) " >
import { Component, ViewChild } from ' @angular/core ' ;
import { FilesGridComponent, FileUploadEvent } from ' @memberjunction/ng-file-storage ' ;
selector: ' app-document-manager ' ,
<div class="file-manager">
(categorySelected)="onCategorySelected($event)">
</mj-files-category-tree>
[CategoryID]="selectedCategoryId"
(fileUpload)="onFileUploaded($event)">
<mj-files-grid #filesGrid
[CategoryID]="selectedCategoryId">
export class DocumentManagerComponent {
@ViewChild ( ' filesGrid ' ) filesGrid !: FilesGridComponent ;
selectedCategoryId : string | undefined ;
onCategorySelected ( categoryId : string | undefined ) {
this . selectedCategoryId = categoryId;
onFileUploaded ( event : FileUploadEvent ) {
console . log ( ' Uploaded: ' , event . file . Name );
this . filesGrid . Refresh ();
Hierarchical tree view for managing file categories with drag-and-drop reorganization.
Output Type Description categorySelectedEventEmitter<string | undefined>Emitted when a category is selected
Method Description createNewCategory()Opens dialog to create a category deleteCategory(category)Deletes a category with error handling handleDrop(e)Handles drag-and-drop to move categories Refresh()Refreshes the category tree clearSelection()Clears the current selection
Kendo Grid for displaying and managing files with inline editing.
Input Type Default Description CategoryIDstring | undefinedundefinedCategory ID to filter files by
Method Description downloadFile(file)Downloads file via provider’s signed URL deleteFile(file)Deletes file with confirmation saveEditFile()Saves changes to file metadata resetEditFile()Cancels metadata editing canBeDeleted(file)Checks if file can be deleted Refresh()Refreshes the files grid
File upload component with storage provider integration and overwrite protection.
Input Type Default Description disabledbooleanfalseDisable the upload component CategoryIDstring | undefinedundefinedCategory ID for uploaded files
Output Type Description uploadStartedEventEmitter<void>Emitted when upload begins fileUploadEventEmitter<FileUploadEvent>Emitted on upload completion
Property Type Description IsUploadingbooleanWhether files are currently uploading
| { success : true ; file : FileEntity }
| { success : false ; file : FileInfo };
User selects a file through the upload component
A preliminary file record is created in the MemberJunction system
If a file with the same name exists, a confirmation dialog appears
On confirmation, the file uploads to the active storage provider
The file record status updates to “Uploaded”
The fileUpload event emits with success status and file details
File deletion is restricted based on upload status and age (10 minutes for pending files)
Overwrite protection prompts users before replacing existing files
Download uses provider-specific signed URLs for security
Category drag-and-drop supports reorganizing the hierarchy
All operations include loading state indicators
Package Description @memberjunction/coreCore metadata and entity access @memberjunction/core-entitiesFile-related entity types @memberjunction/globalGlobal utilities @memberjunction/graphql-dataproviderGraphQL data operations @memberjunction/ng-container-directivesContainer directives @memberjunction/ng-sharedShared Angular services @memberjunction/ng-shared-genericShared generic components @progress/kendo-angular-gridData grid @progress/kendo-angular-treeviewCategory tree @progress/kendo-angular-uploadFile upload @progress/kendo-angular-dialogConfirmation dialogs @progress/kendo-angular-buttonsButton components @progress/kendo-angular-dropdownsDropdown components @progress/kendo-angular-indicatorsLoading indicators @progress/kendo-angular-menuContext menu
@angular/common ^21.x
@angular/core ^21.x
@angular/forms ^21.x
@angular/router ^21.x
cd packages/Angular/Generic/file-storage
ISC