From 5d077e843d2d8a0508509b8ac1fb6eaf30694ee6 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Thu, 15 May 2025 10:58:55 -0400 Subject: [PATCH] allow filename to be provided during module export --- Oqtane.Client/Modules/Admin/Modules/Export.razor | 13 ++++++++++--- .../Resources/Modules/Admin/Modules/Export.resx | 9 ++++++--- Oqtane.Client/Services/Interfaces/IModuleService.cs | 3 ++- Oqtane.Client/Services/ModuleService.cs | 4 ++-- Oqtane.Server/Controllers/ModuleController.cs | 10 +++++----- 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Modules/Export.razor b/Oqtane.Client/Modules/Admin/Modules/Export.razor index ab714221..f7fd3a57 100644 --- a/Oqtane.Client/Modules/Admin/Modules/Export.razor +++ b/Oqtane.Client/Modules/Admin/Modules/Export.razor @@ -27,6 +27,12 @@ +
+ +
+ +
+

@@ -39,6 +45,7 @@ @code { private string _content = string.Empty; private FileManager _filemanager; + private string _filename = string.Empty; public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; public override string Title => "Export Content"; @@ -62,12 +69,12 @@ try { var folderid = _filemanager.GetFolderId(); - if (folderid != -1) + if (folderid != -1 && !string.IsNullOrEmpty(_filename)) { - var result = await ModuleService.ExportModuleAsync(ModuleState.ModuleId, PageState.Page.PageId, folderid); + var result = await ModuleService.ExportModuleAsync(ModuleState.ModuleId, PageState.Page.PageId, folderid, _filename); if (result.Success) { - AddModuleMessage(string.Format(Localizer["Success.Export.File"], result.Message), MessageType.Success); + AddModuleMessage(Localizer["Success.Content.Export"], MessageType.Success); } else { diff --git a/Oqtane.Client/Resources/Modules/Admin/Modules/Export.resx b/Oqtane.Client/Resources/Modules/Admin/Modules/Export.resx index 90e614c2..0a365dfd 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Modules/Export.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Modules/Export.resx @@ -148,9 +148,12 @@ Select a folder where you wish to save the exported content - Please Select A Folder Before Choosing Export + Please Select A Folder And Provide A Filename Before Choosing Export - - Content Was Successfully Exported To Specified Folder With Filename {0} + + Filename: + + + Specify a name for the file (without an extension) \ No newline at end of file diff --git a/Oqtane.Client/Services/Interfaces/IModuleService.cs b/Oqtane.Client/Services/Interfaces/IModuleService.cs index 34a9c1b1..a2334a20 100644 --- a/Oqtane.Client/Services/Interfaces/IModuleService.cs +++ b/Oqtane.Client/Services/Interfaces/IModuleService.cs @@ -66,7 +66,8 @@ namespace Oqtane.Services /// /// /// + /// /// success/failure - Task ExportModuleAsync(int moduleId, int pageId, int folderId); + Task ExportModuleAsync(int moduleId, int pageId, int folderId, string filename); } } diff --git a/Oqtane.Client/Services/ModuleService.cs b/Oqtane.Client/Services/ModuleService.cs index 1e688610..68d1e4fd 100644 --- a/Oqtane.Client/Services/ModuleService.cs +++ b/Oqtane.Client/Services/ModuleService.cs @@ -51,9 +51,9 @@ namespace Oqtane.Services return await GetStringAsync($"{Apiurl}/export?moduleid={moduleId}&pageid={pageId}"); } - public async Task ExportModuleAsync(int moduleId, int pageId, int folderId) + public async Task ExportModuleAsync(int moduleId, int pageId, int folderId, string filename) { - return await PostJsonAsync($"{Apiurl}/export?moduleid={moduleId}&pageid={pageId}&folderid={folderId}", null); + return await PostJsonAsync($"{Apiurl}/export?moduleid={moduleId}&pageid={pageId}&folderid={folderId}&filename={filename}", null); } } } diff --git a/Oqtane.Server/Controllers/ModuleController.cs b/Oqtane.Server/Controllers/ModuleController.cs index e075e5e5..012f2e11 100644 --- a/Oqtane.Server/Controllers/ModuleController.cs +++ b/Oqtane.Server/Controllers/ModuleController.cs @@ -256,15 +256,15 @@ namespace Oqtane.Controllers return content; } - // POST api//export?moduleid=x&pageid=y&folderid=z + // POST api//export?moduleid=x&pageid=y&folderid=z&filename=a [HttpPost("export")] [Authorize(Roles = RoleNames.Registered)] - public Result Export(int moduleid, int pageid, int folderid) + public Result Export(int moduleid, int pageid, int folderid, string filename) { var result = new Result(false); var module = _modules.GetModule(moduleid); if (module != null && module.SiteId == _alias.SiteId && _userPermissions.IsAuthorized(User, module.SiteId, EntityNames.Page, pageid, PermissionNames.Edit) && - _userPermissions.IsAuthorized(User, module.SiteId, EntityNames.Folder, folderid, PermissionNames.Edit)) + _userPermissions.IsAuthorized(User, module.SiteId, EntityNames.Folder, folderid, PermissionNames.Edit) && !string.IsNullOrEmpty(filename)) { // get content var content = _modules.ExportModule(moduleid); @@ -277,8 +277,8 @@ namespace Oqtane.Controllers Directory.CreateDirectory(folderPath); } - // create text file - var filename = Utilities.GetTypeNameLastSegment(module.ModuleDefinitionName, 0) + moduleid.ToString() + ".json"; + // create json file + filename = Path.GetFileNameWithoutExtension(filename) + ".json"; string filepath = Path.Combine(folderPath, filename); if (System.IO.File.Exists(filepath)) {