Unplanned
Last Updated: 13 May 2025 08:01 by Harald
Created by: Naved
Comments: 3
Category: FileManager
Type: Feature Request
23
Currently, the upload functionality of the FileManager allows uploading only one file. I'd like to be able to upload multiple files.
Duplicated
Last Updated: 13 May 2025 07:47 by ADMIN
Created by: Harald
Comments: 0
Category: FileManager
Type: Feature Request
1
While many properties of the `TelerikUpload` component inside the `TelerikFileManager` are customizable using the `FileManagerUploadSettings` some aren't.

The `Multiple` property is always set to `false` (see code below); one can drag & drop multiple files to the dropzone but only one is uploaded at a time.
Our customers won't accept this behavior as it makes uploads of multiple files very cumbersome. This "detail" makes the `TelerikFileManager` unsuitable for our application.

Please make the `Multiple` property configurable via the `FileManagerUploadSettings`.
(You may also want to consider making `AutoUpload` configurable while you're at it).
__builder2.OpenComponent<TelerikUpload>(266);
__builder2.AddAttribute(267, "AutoUpload", (object?)RuntimeHelpers.TypeCheck(value: true));
__builder2.AddAttribute(268, "SaveUrl", (object?)RuntimeHelpers.TypeCheck(UploadSettings.SaveUrl));
__builder2.AddAttribute(269, "SaveField", (object?)RuntimeHelpers.TypeCheck(UploadSettings.SaveField));
__builder2.AddAttribute(270, "RemoveUrl", (object?)RuntimeHelpers.TypeCheck(UploadSettings.RemoveUrl));
__builder2.AddAttribute(271, "RemoveField", (object?)RuntimeHelpers.TypeCheck(UploadSettings.RemoveField));
__builder2.AddAttribute(272, "WithCredentials", (object?)RuntimeHelpers.TypeCheck(UploadSettings.WithCredentials));
__builder2.AddAttribute(273, "Multiple", (object?)RuntimeHelpers.TypeCheck(value: false));
__builder2.AddAttribute(274, "AllowedExtensions", RuntimeHelpers.TypeCheck(UploadSettings.AllowedExtensions));
__builder2.AddAttribute(275, "MinFileSize", RuntimeHelpers.TypeCheck(UploadSettings.MinFileSize));


Unplanned
Last Updated: 25 Apr 2025 12:31 by David

I want to use the built-in FileManagerToolBarSortTool but I want to remove the "Date Modified" option from the "Sort BY" menu.

===

ADMIN EDIT

===

For the time being, a possible option is to create a custom tool for sorting. You can use the SplitButton component to simulate the built-in UI. Upon selecting option from the dropdown, you may sort your data collection based on the selected custom sort option. Call the Rebind method to refresh the data after updating it.

Unplanned
Last Updated: 16 Apr 2025 10:36 by ADMIN
Created by: Rahul
Comments: 3
Category: FileManager
Type: Feature Request
24
Currently, the FileManager Grid has 3 columns -  Name, Date Created, and File Size. I would like to be able to customize them, i.e. add/remove columns
Unplanned
Last Updated: 18 Mar 2025 14:25 by David
When one or more items have been selected in FileManager's List/Grid View and you click "anywhere else", ie, column header, etc., the items stay selected. I feel like they should be unselected, if you click "anywhere" else outside the list/grid view.

Is there any way to achieve this behavior?
Unplanned
Last Updated: 11 Mar 2025 11:14 by David
Set the EnableLoaderContainer to true. Add delay (no matter how much) during an action. The loader will not appear as expected - it will only pop for a second after the action.
Completed
Last Updated: 17 Feb 2025 08:31 by ADMIN
Release 2025 Q2 (May)

When the user renames a folder, the TreeView foes not refresh to display the new folder name.

The test page below is based on the FileManager Events example.

A possible workaround is to recreate the FileManager in the OnUpdate handler:

@using System.IO

@if (ShouldRenderFileManager)
{
    <TelerikFileManager @ref="@FileManagerRef"
                        Data="@Files"
                        @bind-Path="@DirectoryPath"
                        View="@CurrentView"
                        ViewChanged="@OnViewChanged"
                        Height="400px"
                        OnCreate="@OnCreateHandler"
                        OnUpdate="@OnUpdateHandler"
                        OnDelete="@OnDeleteHandler"
                        OnModelInit="@OnModelInitHandler"
                        OnDownload="@OnDownloadHandler"
                        SelectedItems="@SelectedItems"
                        SelectedItemsChanged="@((IEnumerable<FlatFileEntry> selectedFiles) => OnSelect(selectedFiles))">
    </TelerikFileManager>
}

@foreach (var item in Files)
{
    <div>@item.Name</div>
}

@code {
    private bool ShouldRenderFileManager { get; set; } = true;

    private TelerikFileManager<FlatFileEntry>? FileManagerRef { get; set; }
    private List<FlatFileEntry> Files { get; set; } = new();

    private string DirectoryPath { get; set; } = string.Empty;

    private IEnumerable<FlatFileEntry> SelectedItems { get; set; } = new List<FlatFileEntry>();

    private FileManagerViewType CurrentView { get; set; }

    private void OnViewChanged(FileManagerViewType newView)
    {
        CurrentView = newView;
    }

    private async Task OnCreateHandler(FileManagerCreateEventArgs args)
    {
        var newFolder = args.Item as FlatFileEntry;

        var parent = GetParent(newFolder, DirectoryPath);

        newFolder.Id = "20";
        newFolder.ParentId = parent.Id;
        newFolder.Name = "New folder";
        newFolder.IsDirectory = true;
        newFolder.HasDirectories = false;
        newFolder.DateCreated = DateTime.Now;
        newFolder.DateCreatedUtc = DateTime.Now;
        newFolder.DateModified = DateTime.Now;
        newFolder.DateModifiedUtc = DateTime.Now;
        newFolder.Path = Path.Combine(DirectoryPath, newFolder.Name);
        newFolder.Extension = null;

        var parentDirectory = GetDirectory(DirectoryPath) ?? GetParent(newFolder, DirectoryPath);

        if (parentDirectory != null)
        {
            // Simulate add to the file system.
            newFolder.ParentId = parentDirectory.Id;
            Files.Add(newFolder);
            parentDirectory.HasDirectories = Files.Count(x => x.ParentId == parentDirectory.Id) > 0;
        }
        else
        {
            // Create a folder in the root directory.
            Files.Add(newFolder);
        }

        RefreshData();
    }

    private FlatFileEntry GetDirectory(string path)
    {
        var directory = Files.FirstOrDefault(x => x.IsDirectory && x.Path == path);

        return directory;
    }

    private FlatFileEntry GetParent(FlatFileEntry currItem, string currDirectory)
    {
        var parentItem = Files
            .FirstOrDefault(x => x.IsDirectory && x.Path == currDirectory);

        return parentItem;
    }


    private async Task OnUpdateHandler(FileManagerUpdateEventArgs args)
    {
        var item = args.Item as FlatFileEntry;

        if (item.IsDirectory)
        {
            var name = item.Name ?? string.Empty;

            var updatedItem = Files.FirstOrDefault(x => x.Id == item.Id);
            updatedItem.Name = item.Name;
            updatedItem.Path = Path.Combine(DirectoryPath, name);

            ShouldRenderFileManager = false;
            await Task.Delay(1);
            ShouldRenderFileManager = true;
        }
        else
        {
            // The name property is updated, but also update the path to the file.
            var name = item.Name ?? string.Empty;
            var extension = item.Extension ?? string.Empty;
            var fullName = extension.Length > 0 && name.EndsWith(extension) ?
                name : $"{name}{extension}";

            var updatedItem = Files.FirstOrDefault(x => x.Id == item.Id);

            updatedItem.Name = item.Name;
            updatedItem.Path = Path.Combine(DirectoryPath, fullName);
            Console.WriteLine(updatedItem.Path);
        }
    }

    private async Task OnDownloadHandler(FileManagerDownloadEventArgs args)
    {
        var selectedItem = args.Item as FlatFileEntry;

        // The Filemanager does not have the actual file.
        // Obtain the file contents, based on args.Item, and set the event arguments:

        //args.Stream = the file stream of the actual selected file;
        //args.MimeType = the MIME type of the actual file;
        //args.FileName = the file name that the browser will receive (optional);

        FlatFileEntry actualFile = (FlatFileEntry)args.Item;

        string dummyFileContent = $"This file is a dummy version of {actualFile.Name}. It was downloaded with the Telerik Blazor FileManager.";
        byte[] dummyFileBuffer = System.Text.Encoding.UTF8.GetBytes(dummyFileContent);

        args.Stream = new MemoryStream(dummyFileBuffer);
        args.MimeType = "text/plain";
        args.FileName = $"filemanager-{actualFile.Name}-{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}.txt";
    }

    private async Task OnDeleteHandler(FileManagerDeleteEventArgs args)
    {
        var currItem = args.Item as FlatFileEntry;

        var itemToDelete = Files.FirstOrDefault(x => x.Id == currItem.Id);

        Files.Remove(itemToDelete);

        RefreshData();
    }

    private FlatFileEntry OnModelInitHandler()
    {
        var item = new FlatFileEntry();
        item.Name = $"New folder";
        item.Size = 0;
        item.Path = Path.Combine(DirectoryPath, item.Name);
        item.IsDirectory = true;
        item.HasDirectories = false;
        item.DateCreated = DateTime.Now;
        item.DateCreatedUtc = DateTime.Now;
        item.DateModified = DateTime.Now;
        item.DateModifiedUtc = DateTime.Now;

        return item;
    }

    private void OnSelect(IEnumerable<FlatFileEntry> selectedFiles)
    {
        // Update the view model.
        SelectedItems = selectedFiles;
    }

    private void RefreshData()
    {
        Files = new List<FlatFileEntry>(Files);
    }

    protected override async Task OnInitializedAsync()
    {
        Files = await GetFlatFileEntries();
    }

    public class FlatFileEntry
    {
        public string Id { get; set; }
        public string ParentId { get; set; }
        public string Name { get; set; }
        public long Size { get; set; }
        public string Path { get; set; }
        public string Extension { get; set; }
        public bool IsDirectory { get; set; }
        public bool HasDirectories { get; set; }
        public DateTime DateCreated { get; set; }
        public DateTime DateCreatedUtc { get; set; }
        public DateTime DateModified { get; set; }
        public DateTime DateModifiedUtc { get; set; }
    }

    // the next lines are hardcoded data generation so you can explore the FileManager freely

    private async Task<List<FlatFileEntry>> GetFlatFileEntries()
    {
        var workFiles = new FlatFileEntry()
        {
            Id = "1",
            ParentId = null,
            Name = "Work Files",
            IsDirectory = true,
            HasDirectories = true,
            DateCreated = new DateTime(2022, 1, 2),
            DateCreatedUtc = new DateTime(2022, 1, 2),
            DateModified = new DateTime(2022, 2, 3),
            DateModifiedUtc = new DateTime(2022, 2, 3),
            Path = Path.Combine("files"),
            Size = 3 * 1024 * 1024
        };

        var Documents = new FlatFileEntry()
        {
            Id = "2",
            ParentId = workFiles.Id,
            Name = "Documents",
            IsDirectory = true,
            HasDirectories = false,
            DateCreated = new DateTime(2022, 1, 2),
            DateCreatedUtc = new DateTime(2022, 1, 2),
            DateModified = new DateTime(2022, 2, 3),
            DateModifiedUtc = new DateTime(2022, 2, 3),
            Path = Path.Combine(workFiles.Path, "documents"),
            Size = 1024 * 1024
        };

        var Images = new FlatFileEntry()
        {
            Id = "3",
            ParentId = workFiles.Id,
            Name = "Images",
            IsDirectory = true,
            HasDirectories = false,
            DateCreated = new DateTime(2022, 1, 2),
            DateCreatedUtc = new DateTime(2022, 1, 2),
            DateModified = new DateTime(2022, 2, 3),
            DateModifiedUtc = new DateTime(2022, 2, 3),
            Path = Path.Combine(workFiles.Path, "images"),
            Size = 2 * 1024 * 1024
        };

        var files = new List<FlatFileEntry>()
{
            workFiles,

            Documents,

            Images
        };

        return files;
    }
}

Unplanned
Last Updated: 12 Feb 2025 11:46 by David
Created by: David
Comments: 0
Category: FileManager
Type: Feature Request
1
Please expose the ability to select FileManager items in the Grid view with checkboxes. This will allow users to use similar UX to the GridCheckBoxColumn.
Unplanned
Last Updated: 09 Oct 2024 13:54 by Hang
Created by: Hang
Comments: 0
Category: FileManager
Type: Feature Request
4
Is there any option to enable the use of escape backslash "\\" in the path?
Unplanned
Last Updated: 04 Oct 2024 09:34 by ADMIN
Created by: Fabien
Comments: 3
Category: FileManager
Type: Feature Request
4

Greetings.

I was using the FileManager recently and wanted to make sure the user could only select a single file. I was expecting a parameter to configure that but I didn't find any. I was able to bypass the issue by acting on the value reported by the component but I found it a bit inconvenient.

I think it might be interesting if we could:

  • choose if we select one or several elements (single vs multiple selection, like with grids)
  • choose what element we can select (files & folders, files only, folders only)

What do you think?

Unplanned
Last Updated: 02 Aug 2024 13:46 by ADMIN
Created by: Rahul
Comments: 3
Category: FileManager
Type: Feature Request
24
Currently, the built-in PreviewPane of the FileManager cannot be modified to include additional information such as new fields or formatting.
Unplanned
Last Updated: 17 Jul 2024 07:01 by ADMIN
Can I change the content of the Delete popup?
Unplanned
Last Updated: 11 Jul 2024 14:46 by Hang
When you right-click an item to open the Context Menu and select the "Delete" option, the confirmation dialog appears hidden behind the menu.
Unplanned
Last Updated: 28 May 2024 07:45 by ADMIN

Currently, only the "Download" option has an icon and this is not consistent:

Unplanned
Last Updated: 28 May 2024 07:35 by ADMIN
Created by: Kees
Comments: 3
Category: FileManager
Type: Feature Request
40
The ability to choose which options to appear in the ContextMenu.
Unplanned
Last Updated: 14 May 2024 08:47 by ADMIN
Created by: Kees
Comments: 3
Category: FileManager
Type: Feature Request
17

The need to right-click a file to be able to download it is a bit less intuitive.

I would like to be able to download a file by double-clicking it, or, more generic, to be able to add a double click handler so I can decide what to do with it.

Completed
Last Updated: 02 Apr 2024 11:54 by ADMIN
Release 2024 Q2 (May)
Created by: Kees
Comments: 3
Category: FileManager
Type: Feature Request
42
The ability to choose which buttons (options) to show in the toolbar.
Duplicated
Last Updated: 15 Mar 2024 07:33 by Fabien

Greetings.

I was using the FileManager component for a project and wanted to disable some operations since in my use case, it must not be possible to do them. But I was surprized to notice that this apparently cannot be done. So I suggest to add boolean parameters that will allow to disable the following features:

  • new folder
  • renaming
  • searching
  • details pan
  • download
  • upload
  • delete

Of course, the goal here would be to render the user interface accordingly. E.g., if deletion is disabled:

  • remove the Delete entry in the right click menu
  • and never call the OnDelete event.
Completed
Last Updated: 16 Feb 2024 08:10 by ADMIN
Release 2024 Q2 (May)
Created by: Rahul
Comments: 5
Category: FileManager
Type: Feature Request
27
Currently, the thumbnail view is the default for the FileManager. I would like to be able to show the grid/listview view by default.
Duplicated
Last Updated: 08 Feb 2024 08:51 by ADMIN
Created by: Wolf-Günter
Comments: 2
Category: FileManager
Type: Bug Report
5
If the FileManager is nested inside an EditForm or a TelerikForm, it will trigger exceptions. Some of the nested components in the FileManager will require a ValueExpression, as if they are related to the form's EditContext.
1 2 3