From 9971510b1e882108c481c9fcca2b5bb035c40859 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Tue, 8 Oct 2019 16:11:23 -0400 Subject: [PATCH] improved file upload, enhanced module installation from Nuget to support upgrades, added ability to upgrade the framework from Nuget, completed isolated multitenancy and site alias management, created IPortable interface for importing data into modules, added default content to initial installation --- .../Modules/Admin/ModuleDefinitions/Add.razor | 47 +++++- .../Admin/ModuleDefinitions/Index.razor | 29 ++++ .../Modules/Admin/Modules/Export.razor | 32 ++++ .../Modules/Admin/Modules/Import.razor | 41 ++++++ .../Index.razor => Modules/Settings.razor} | 6 +- Oqtane.Client/Modules/Admin/Sites/Add.razor | 28 ++-- Oqtane.Client/Modules/Admin/Sites/Edit.razor | 37 +++++ Oqtane.Client/Modules/Admin/Tenants/Add.razor | 21 ++- Oqtane.Client/Modules/Admin/Themes/Add.razor | 47 +++++- .../Modules/Admin/Themes/Index.razor | 31 ++++ .../Modules/Admin/Upgrade/Index.razor | 104 +++++++++++++ .../Modules/Controls/FileUpload.razor | 13 +- .../HtmlText/{Module.cs => ModuleInfo.cs} | 5 +- .../HtmlText/Services/HtmlTextService.cs | 5 +- Oqtane.Client/Modules/ModuleBase.cs | 9 ++ Oqtane.Client/Services/FileService.cs | 28 +++- Oqtane.Client/Services/InstallationService.cs | 5 + .../Services/Interfaces/IFileService.cs | 4 +- .../Interfaces/IInstallationService.cs | 2 +- .../Services/Interfaces/IModuleService.cs | 2 + Oqtane.Client/Services/ModuleService.cs | 10 ++ Oqtane.Client/Shared/Installer.razor | 6 +- Oqtane.Client/Shared/Interop.cs | 14 ++ Oqtane.Client/Shared/ModuleInstance.razor | 8 +- Oqtane.Client/Shared/Pane.razor | 27 ++-- Oqtane.Client/Shared/SiteRouter.razor | 7 +- Oqtane.Client/Shared/Utilities.cs | 12 ++ Oqtane.Client/Themes/ContainerBase.cs | 9 ++ .../Themes/Controls/ModuleActions.razor | 15 +- .../Themes/Controls/ModuleTitle.razor | 3 +- Oqtane.Client/wwwroot/js/interop.js | 10 ++ Oqtane.Server/Controllers/AliasController.cs | 1 + Oqtane.Server/Controllers/FileController.cs | 21 ++- .../Controllers/InstallationController.cs | 77 +++++++--- Oqtane.Server/Controllers/ModuleController.cs | 122 ++++++++++++++- .../Controllers/PackageController.cs | 4 + .../Infrastructure/InstallationManager.cs | 3 +- .../HtmlText/Manager/HtmlTextManager.cs | 46 ++++++ Oqtane.Server/Modules/IPortable.cs | 13 ++ Oqtane.Server/Repository/AliasRepository.cs | 3 + .../Repository/ModuleDefinitionRepository.cs | 32 +++- Oqtane.Server/Repository/SiteRepository.cs | 139 ++++++++++++------ Oqtane.Server/Repository/TenantRepository.cs | 3 + Oqtane.Server/wwwroot/js/interop.js | 10 ++ Oqtane.Shared/Models/ModuleContent.cs | 9 ++ Oqtane.Shared/Models/ModuleDefinition.cs | 2 + Oqtane.Shared/Models/PageTemplate.cs | 10 +- Oqtane.Shared/Shared/Constants.cs | 6 +- 48 files changed, 961 insertions(+), 157 deletions(-) create mode 100644 Oqtane.Client/Modules/Admin/Modules/Export.razor create mode 100644 Oqtane.Client/Modules/Admin/Modules/Import.razor rename Oqtane.Client/Modules/Admin/{ModuleSettings/Index.razor => Modules/Settings.razor} (98%) create mode 100644 Oqtane.Client/Modules/Admin/Upgrade/Index.razor rename Oqtane.Client/Modules/HtmlText/{Module.cs => ModuleInfo.cs} (76%) create mode 100644 Oqtane.Server/Modules/HtmlText/Manager/HtmlTextManager.cs create mode 100644 Oqtane.Server/Modules/IPortable.cs create mode 100644 Oqtane.Shared/Models/ModuleContent.cs diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor index c7122339..91ed5b0a 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -11,7 +11,7 @@ - + @@ -50,18 +50,55 @@ bool uploaded = false; List packages; + FileUpload fileupload; protected override async Task OnInitializedAsync() { + List moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); packages = await PackageService.GetPackagesAsync("module"); + foreach(Package package in packages.ToArray()) + { + if (moduledefinitions.Exists(item => Utilities.GetTypeName(item.ModuleDefinitionName) == package.PackageId)) + { + packages.Remove(package); + } + } } private async Task UploadFile() { - await FileService.UploadFilesAsync("Modules"); - ModuleInstance.AddModuleMessage("Module Uploaded Successfully. Click Install To Complete Installation.", MessageType.Success); - uploaded = true; - StateHasChanged(); + string[] files = await fileupload.GetFiles(); + if (files.Length > 0) + { + if (files[0].Contains(".Module.")) + { + try + { + if (await FileService.UploadFilesAsync("Modules", files, "")) + { + ModuleInstance.AddModuleMessage("Module Uploaded Successfully. Click Install To Complete Installation.", MessageType.Success); + uploaded = true; + StateHasChanged(); + } + else + { + ModuleInstance.AddModuleMessage("Module Upload Failed.", MessageType.Error); + } + } + catch (Exception ex) + { + ModuleInstance.AddModuleMessage("Module Upload Failed. " + ex.Message, MessageType.Error); + } + } + else + { + ModuleInstance.AddModuleMessage("Invalid Module Package", MessageType.Error); + } + } + else + { + ModuleInstance.AddModuleMessage("You Must Select A Module To Upload", MessageType.Warning); + } } private async Task InstallModules() diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor index 26e480f2..ad7a803f 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor @@ -1,6 +1,8 @@ @namespace Oqtane.Modules.Admin.ModuleDefinitions @inherits ModuleBase +@inject NavigationManager NavigationManager @inject IModuleDefinitionService ModuleDefinitionService +@inject IPackageService PackageService @if (moduledefinitions == null) { @@ -16,12 +18,19 @@ else Version     +   @context.Name @context.Version + + @if (UpgradeAvailable(context.ModuleDefinitionName, context.Version)) + { + + } + } @@ -30,9 +39,29 @@ else public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Host; } } List moduledefinitions; + List packages; protected override async Task OnInitializedAsync() { moduledefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId); + packages = await PackageService.GetPackagesAsync("module"); + } + + private bool UpgradeAvailable(string moduledefinitionname, string version) + { + bool upgradeavailable = false; + Package package = packages.Where(item => item.PackageId == Utilities.GetTypeName(moduledefinitionname)).FirstOrDefault(); + if (package != null) + { + upgradeavailable = (Version.Parse(package.Version).CompareTo(Version.Parse(version)) > 0); + } + return upgradeavailable; + } + + private async Task DownloadModule(string moduledefinitionname, string version) + { + await PackageService.DownloadPackageAsync(moduledefinitionname, version, "Modules"); + await ModuleDefinitionService.InstallModulesAsync(); + NavigationManager.NavigateTo(NavigateUrl(Reload.Application)); } } \ No newline at end of file diff --git a/Oqtane.Client/Modules/Admin/Modules/Export.razor b/Oqtane.Client/Modules/Admin/Modules/Export.razor new file mode 100644 index 00000000..c8368d40 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Modules/Export.razor @@ -0,0 +1,32 @@ +@namespace Oqtane.Modules.Admin.Modules +@inherits ModuleBase +@inject NavigationManager NavigationManager +@inject IModuleService ModuleService + + + + + +
+ + +