diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs index 7090853734..026b4ca48c 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/ProjectCreationCommandBase.cs @@ -103,12 +103,18 @@ public abstract class ProjectCreationCommandBase Logger.LogInformation("UI Framework: " + uiFramework); } - var theme = uiFramework == UiFramework.None ? (Theme?)null : GetTheme(commandLineArgs); + var theme = uiFramework == UiFramework.None ? (Theme?)null : GetThemeByTemplateOrNull(commandLineArgs, template); if (theme.HasValue) { Logger.LogInformation("Theme: " + theme); } + var themeStyle = theme.HasValue ? GetThemeStyleOrNull(commandLineArgs, theme.Value) : (ThemeStyle?)null; + if(themeStyle.HasValue) + { + Logger.LogInformation("Theme Style: " + themeStyle); + } + var publicWebSite = uiFramework != UiFramework.None && commandLineArgs.Options.ContainsKey(Options.PublicWebSite.Long); if (publicWebSite) { @@ -221,7 +227,8 @@ public abstract class ProjectCreationCommandBase commandLineArgs.Options, connectionString, pwa, - theme + theme, + themeStyle ); } @@ -360,7 +367,7 @@ public abstract class ProjectCreationCommandBase return DatabaseProvider.MongoDb; } - throw new CliUsageException("The option you provided for Database Provider is invalid!"); + throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage("Database Provider")); } protected virtual async Task RunGraphBuildForMicroserviceServiceTemplate(ProjectBuildArgs projectArgs) @@ -471,7 +478,7 @@ public abstract class ProjectCreationCommandBase case "oracle": return DatabaseManagementSystem.Oracle; default: - throw new CliUsageException("The option you provided for Database Management System is invalid!"); + throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage("Database Management System")); } } @@ -487,7 +494,7 @@ public abstract class ProjectCreationCommandBase case "react-native": return MobileApp.ReactNative; default: - throw new CliUsageException("The option you provided for Mobile App is invalid!"); + throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage("Mobile App")); } } @@ -515,23 +522,59 @@ public abstract class ProjectCreationCommandBase case "blazor-server": return UiFramework.BlazorServer; default: - throw new CliUsageException("The option you provided for UI Framework is invalid!"); + throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage("UI Framework")); } } - protected virtual Theme GetTheme(CommandLineArgs commandLineArgs) + protected virtual Theme? GetThemeByTemplateOrNull(CommandLineArgs commandLineArgs, string template = "app") { - var optionValue = commandLineArgs.Options.GetOrNull(Options.Theme.Long); - switch (optionValue) + var theme = commandLineArgs.Options.GetOrNull(Options.Theme.Long)?.ToLower(); + + return template switch { - case null: - case "leptonx-lite": - return Theme.LeptonXLite; - case "basic": - return Theme.Basic; - default: - throw new CliUsageException("The option you provided for Theme is invalid!"); + AppTemplate.TemplateName or AppNoLayersTemplate.TemplateName => GetAppTheme(), + AppProTemplate.TemplateName or AppNoLayersProTemplate.TemplateName or MicroserviceProTemplate.TemplateName => GetAppProTheme(), + _ => null + }; + + Theme GetAppTheme() + { + return theme switch + { + // null or "leptonx-lite" => Theme.LeptonXLite, + "basic" => Theme.Basic, + _ => Theme.LeptonXLite + }; } + + Theme GetAppProTheme() + { + return theme switch + { + // null or "leptonx" => Theme.LeptonX, + "lepton" => Theme.Lepton, + "basic" => Theme.Basic, + _ => Theme.LeptonX //TODO: default??? + }; + } + } + + protected virtual ThemeStyle? GetThemeStyleOrNull(CommandLineArgs commandLineArgs, Theme theme) + { + if(theme != Theme.LeptonX) + { + return null; + } + + var themeStyle = commandLineArgs.Options.GetOrNull(Options.ThemeStyle.Long)?.ToLower(); + return themeStyle switch + { + // null => ThemeStyle.NotSpecified, TODO: remove it!!! + "dim" or null => ThemeStyle.Dim, + "light" => ThemeStyle.Light, + "dark" => ThemeStyle.Dark, + _ => null + }; } protected void ConfigureNpmPackagesForTheme(ProjectBuildArgs projectArgs) @@ -546,6 +589,15 @@ public abstract class ProjectCreationCommandBase case Theme.Basic: ConfigureNpmPackagesForBasicTheme(projectArgs); break; + case Theme.Lepton: + ConfigureNpmPackagesForLeptonTheme(projectArgs); + break; + case Theme.NotSpecified: + case Theme.LeptonXLite: + case Theme.LeptonX: + break; + default: + throw new CliUsageException(ExceptionMessageHelper.GetInvalidOptionExceptionMessage(Options.Theme.Long)); } } @@ -566,6 +618,25 @@ public abstract class ProjectCreationCommandBase ThemePackageAdder.AddAngularPackage(projectArgs.OutputFolder, "@abp/ng.theme.basic", projectArgs.Version); } } + + private void ConfigureNpmPackagesForLeptonTheme(ProjectBuildArgs projectArgs) + { + if (projectArgs.UiFramework is not UiFramework.None or UiFramework.Angular) + { + ThemePackageAdder.AddNpmPackage(projectArgs.OutputFolder, "@volo/abp.aspnetcore.mvc.ui.theme.lepton", projectArgs.Version); + } + + if (projectArgs.UiFramework is UiFramework.BlazorServer) + { + ThemePackageAdder.AddNpmPackage(projectArgs.OutputFolder, "@volo/abp.aspnetcore.components.server.leptontheme", projectArgs.Version); + ThemePackageAdder.AddNpmPackage(projectArgs.OutputFolder, "@volo/abp.aspnetcore.mvc.ui.theme.lepton", projectArgs.Version); + } + + if (projectArgs.UiFramework is UiFramework.Angular) + { + ThemePackageAdder.AddAngularPackage(projectArgs.OutputFolder, "@volo/abp.ng.theme.lepton", projectArgs.Version); + } + } public static class Options { @@ -669,5 +740,10 @@ public abstract class ProjectCreationCommandBase { public const string Long = "theme"; } + + public static class ThemeStyle + { + public const string Long = "theme-style"; + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStep.cs index 4409f258b3..dcf8496e66 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStep.cs @@ -1,5 +1,10 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Xml; +using Volo.Abp.Cli.ProjectBuilding.Files; +using Volo.Abp.Cli.ProjectBuilding.Templates.App; +using Volo.Abp.Cli.Utils; namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; @@ -17,419 +22,131 @@ public class ChangeThemeStep : ProjectBuildPipelineStep case Theme.Basic: ChangeToBasicTheme(context); break; + case Theme.Lepton: + ChangeToLeptonTheme(context); + break; } } protected void ChangeToBasicTheme(ProjectBuildContext context) { - #region MyCompanyName.MyProjectName.Web - - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); + var defaultThemeName = context.BuildArgs.TemplateName is AppTemplate.TemplateName or AppNoLayersTemplate.TemplateName + ? "LeptonXLite" + : "LeptonX"; - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); + #region MVC Projects - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); + ChangeThemeToBasicForMvcProjects(context, defaultThemeName); #endregion - - #region MyCompanyName.MyProjectName.HttpApi.Host - - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); - #endregion - #region MyCompanyName.MyProjectName.Blazor ReplacePackageReferenceWithProjectReference( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj", - "Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme", + "/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj", + $"Volo.Abp.AspNetCore.Components.WebAssembly.{defaultThemeName}Theme", @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme\Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme.csproj" ); ChangeNamespaceAndKeyword( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXLiteTheme", + "/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", + $"Volo.Abp.AspNetCore.Components.WebAssembly.{defaultThemeName}Theme", "Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme", - "AbpAspNetCoreComponentsWebAssemblyLeptonXLiteThemeModule", + $"AbpAspNetCoreComponentsWebAssembly{defaultThemeName}ThemeModule", "AbpAspNetCoreComponentsWebAssemblyBasicThemeModule" ); ChangeNamespace( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite", + "/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", + $"Volo.Abp.AspNetCore.Components.Web.{defaultThemeName}Theme.Themes.{defaultThemeName}", "Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic" ); #endregion - #region MyCompanyName.MyProjectName.Blazor.Server - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); + #region Blazor.Server Projects - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.Server.BasicTheme\Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme", - "AbpAspNetCoreComponentsServerLeptonXLiteThemeModule", - "AbpAspNetCoreComponentsServerBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/_Host.cshtml", - "Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite", - "Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor/Pages/_Host.cshtml", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "BlazorLeptonXLiteThemeBundles.Scripts.Global", - "BlazorBasicThemeBundles.Scripts.Global" - ); + ChangeThemeToBasicForBlazorServerProjects(context, defaultThemeName); #endregion - - #region MyCompanyName.MyProjectName.Blazor.Server.Tiered - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); + #region Angular - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.Server.BasicTheme\Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme", - "AbpAspNetCoreComponentsServerLeptonXLiteThemeModule", - "AbpAspNetCoreComponentsServerBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); + var angularPackageName = context.BuildArgs.TemplateName is AppTemplate.TemplateName or AppNoLayersTemplate.TemplateName + ? "@abp/ng.theme.lepton-x" + : "@volosoft/abp.ng.theme.lepton-x"; - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" + ReplaceImportPackage( + context, + "/angular/src/app/app.module.ts", + angularPackageName, + "@abp/ng.theme.basic" ); - - ChangeNamespaceAndKeyword( + + RemoveLinesByStatement( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" + "/angular/src/app/app.module.ts", + "SideMenuLayoutModule" ); - - - ChangeNamespaceAndKeyword( + + ReplaceMethodNames( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Pages/_Host.cshtml", - "Volo.Abp.AspNetCore.Components.Web.LeptonXLiteTheme.Themes.LeptonXLite", - "Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" + "/angular/src/app/app.module.ts", + "ThemeLeptonXModule", + "ThemeBasicModule" ); - ChangeNamespaceAndKeyword( + RemoveLinesByStatement( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/Pages/_Host.cshtml", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "BlazorLeptonXLiteThemeBundles.Scripts.Global", - "BlazorBasicThemeBundles.Scripts.Global" + "/angular/angular.json", + "node_modules/bootstrap-icons/font/bootstrap-icons.css" ); - + #endregion - - #region MyCompanyName.MyProjectName.AuthServer + } - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyCompanyName.MyProjectName.AuthServer.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); + protected void ChangeToLeptonTheme(ProjectBuildContext context) + { + #region Common - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); + RenameLeptonXFolders(context, folderName: "Lepton"); + AddLeptonThemeManagementReferenceToProjects(context); #endregion - - #region MyCompanyName.MyProjectName.Web.Mvc - - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc/MyCompanyName.MyProjectName.Web.Mvc.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); - - #endregion - - #region MyCompanyName.MyProjectName.Web.Mvc.Mongo + #region MVC Projects - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc.Mongo/MyCompanyName.MyProjectName.Web.Mvc.Mongo.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc.Mongo/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); + ChangeThemeToLeptonForMvcProjects(context); - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Mvc.Mongo/MyProjectNameWebModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); - #endregion - #region MyCompanyName.MyProjectName.Blazor.Server - (app-nolayers) - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme", - "AbpAspNetCoreComponentsServerLeptonXLiteThemeModule", - "AbpAspNetCoreComponentsServerBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); + #region MyCompanyName.MyProjectName.Blazor - ChangeNamespaceAndKeyword( + ReplacePackageReferenceWithProjectReference( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" + "/MyCompanyName.MyProjectName.Blazor/MyCompanyName.MyProjectName.Blazor.csproj", + "Volo.Abp.AspNetCore.Components.WebAssembly.LeptonXTheme", + @"..\..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Components.WebAssembly.LeptonTheme\Volo.Abp.AspNetCore.Components.WebAssembly.LeptonTheme.csproj" ); ChangeNamespaceAndKeyword( context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" + "/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", + "Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components", + "Volo.Abp.AspNetCore.Components.Web.LeptonTheme.Components", + "AbpAspNetCoreComponentsWebAssemblyLeptonXThemeModule", + "AbpAspNetCoreComponentsWebAssemblyLeptonThemeModule" ); - + #endregion - - #region MyCompanyName.MyProjectName.Blazor.Server.Mongo - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" - ); - - ReplacePackageReferenceWithProjectReference( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.Server.BasicTheme\Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme", - "AbpAspNetCoreComponentsServerLeptonXLiteThemeModule", - "AbpAspNetCoreComponentsServerBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", - "AbpAspNetCoreMvcUiLeptonXLiteThemeModule", - "AbpAspNetCoreMvcUiBasicThemeModule" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Components.Server.LeptonXLiteTheme.Bundling", - "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", - "LeptonXLiteThemeBundles.Styles.Global", - "BasicThemeBundles.Styles.Global" - ); - - ChangeNamespaceAndKeyword( - context, - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite.Bundling", - "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", - "BlazorLeptonXLiteThemeBundles.Styles.Global", - "BlazorBasicThemeBundles.Styles.Global" - ); - + #region MyCompanyName.MyProjectName.Blazor.Server && MyCompanyName.MyProjectName.Blazor.Server.Tiered + + ChangeThemeToLeptonForBlazorServerProjects(context); + #endregion #region Angular @@ -437,33 +154,208 @@ public class ChangeThemeStep : ProjectBuildPipelineStep ReplaceImportPackage( context, "/angular/src/app/app.module.ts", - "@abp/ng.theme.lepton-x", - "@abp/ng.theme.basic" + "@volosoft/abp.ng.theme.lepton-x", + "@volo/abp.ng.theme.lepton" ); RemoveLinesByStatement( context, "/angular/src/app/app.module.ts", - "SideMenuLayoutModule" + "SideMenuLayoutModule" ); ReplaceMethodNames( context, "/angular/src/app/app.module.ts", "ThemeLeptonXModule", - "ThemeBasicModule" + "ThemeLeptonModule" + ); + + RemoveLinesByStatement( + context, + "/angular/angular.json", + "node_modules/bootstrap-icons/font/bootstrap-icons.css" ); #endregion + + #region MyCompanyName.MyProjectName.Mvc && MyCompanyName.MyProjectName.Mvc.Mongo + + var projectNames = new[] {"Web", "HttpApi", "Application"}; + ConfigureLeptonManagementPackagesForNoLayersMvc(context, @"/MyCompanyName.MyProjectName.Mvc/MyCompanyName.MyProjectName.csproj", projectNames); + + #endregion + + #region MyCompanyName.MyProjectName.Blazor.Server && MyCompanyName.MyProjectName.Blazor.Server.Mongo - (app-nolayers) + + ChangeThemeToLeptonForNoLayersBlazorServerProjects(context); + + #endregion + } + + private void ConfigureLeptonManagementPackagesForNoLayersMvc(ProjectBuildContext context, string targetProjectPath, string[] projectNames) + { + var file = context.Files.FirstOrDefault(f => !f.Name.Contains("Test") && f.Name.Contains(targetProjectPath) && f.Name.Contains(".csproj")); + if (file == null) + { + return; + } + + foreach (var projectName in projectNames) + { + var moduleFile = ConvertProjectFileToModuleFile(context, file); + if (moduleFile == null) + { + continue; + } + + AddProjectReference(file, $@"..\..\..\..\lepton-theme\src\Volo.Abp.LeptonTheme.Management.{projectName}\Volo.Abp.LeptonTheme.Management.{projectName}.csproj"); + AddModuleDependency(moduleFile, $"LeptonThemeManagement{ConvertProjectNameToModuleName($"{projectName}")}Module"); + } + } + + private void ChangeThemeToLeptonForMvcProjects(ProjectBuildContext context) + { + var projectNames = new[] + { + ".Web", ".HttpApi.Host", ".AuthServer", + "" //for app-nolayers-mvc + }; + + foreach (var projectName in projectNames) + { + var projectPath = $"/MyCompanyName.MyProjectName{projectName}/MyCompanyName.MyProjectName{projectName}.csproj"; + var projectFile = context.Files.FirstOrDefault(x => x.Name.Contains(projectPath)); + if (projectFile == null) + { + continue; + } + + var moduleFile = ConvertProjectFileToModuleFile(context, projectFile); + if (moduleFile == null) + { + continue; + } + + ReplacePackageReferenceWithProjectReference( + context, + projectFile.Name, + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + @"..\..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.csproj" + ); + + ChangeNamespaceAndKeyword( + context, + moduleFile.Name, + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Bundling", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.Bundling", + "LeptonXThemeBundles.Styles.Global", + "LeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + moduleFile.Name, + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton", + "AbpAspNetCoreMvcUiLeptonXThemeModule", + "AbpAspNetCoreMvcUiLeptonThemeModule" + ); + + RemoveLinesByStatement( + context, + moduleFile.Name, + "Volo.Abp.LeptonX.Shared;" + ); + } } + private void AddLeptonThemeManagementReferenceToProjects(ProjectBuildContext context) + { + var projects = new Dictionary + { + {"Domain", "MyCompanyName.MyProjectName.Domain.csproj"}, + {"Domain.Shared", "MyCompanyName.MyProjectName.Domain.Shared.csproj"}, + {"Application", "MyCompanyName.MyProjectName.Application.csproj"}, + {"Application.Contracts", "MyCompanyName.MyProjectName.Application.Contracts.csproj"}, + {"Blazor.WebAssembly", "MyCompanyName.MyProjectName.Blazor.csproj"}, + {"Blazor.Server", "MyCompanyName.MyProjectName.Blazor.Server.csproj"}, + {"HttpApi", "MyCompanyName.MyProjectName.HttpApi.csproj"}, + {"HttpApi.Client", "MyCompanyName.MyProjectName.HttpApi.Client.csproj"}, + {"Web.Host", "MyCompanyName.MyProjectName.Web.Host.csproj"}, + {"Web", "MyCompanyName.MyProjectName.Web.csproj"}, + }; + + foreach (var project in projects) + { + AddLeptonThemeManagementReference(context, project); + } + + var microserviceServiceProjects = new Dictionary + { + {"Domain", "MyCompanyName.MyProjectName.AdministrationService.Domain.csproj"}, + {"Domain.Shared", "MyCompanyName.MyProjectName.AdministrationService.Domain.Shared.csproj"}, + {"Application", "MyCompanyName.MyProjectName.AdministrationService.Application.csproj"}, + {"Application.Contracts", "MyCompanyName.MyProjectName.AdministrationService.Application.Contracts.csproj"}, + {"HttpApi", "MyCompanyName.MyProjectName.AdministrationService.HttpApi.csproj"}, + {"HttpApi.Client", "MyCompanyName.MyProjectName.AdministrationService.HttpApi.Client.csproj"}, + {"Web", "MyCompanyName.MyProjectName.AdministrationService.Web.csproj"} + }; + + foreach (var microserviceServiceProject in microserviceServiceProjects) + { + AddLeptonThemeManagementReference(context, microserviceServiceProject); + } + } + + private void AddLeptonThemeManagementReference(ProjectBuildContext context, KeyValuePair projectInfo) + { + var reference = $@"..\..\..\..\..\lepton-theme\src\Volo.Abp.LeptonTheme.Management.{projectInfo.Key}\Volo.Abp.LeptonTheme.Management.{projectInfo.Key}.csproj"; + var projectFile = context.Files.FirstOrDefault(f => !f.Name.Contains("Test") && f.Name.Contains(projectInfo.Value) && f.Name.Contains(".csproj")); + if (projectFile is null) + { + return; + } + + var moduleFile = ConvertProjectFileToModuleFile(context, projectFile); + if (moduleFile == null) + { + return; + } + + AddProjectReference(projectFile, reference); + + AddModuleDependency(moduleFile, $"LeptonThemeManagement{ConvertProjectNameToModuleName(projectInfo.Key)}Module", + underManagementFolder: projectInfo.Key != "HttpApi"); + } + + private void AddModuleDependency(FileEntry moduleFile, string dependency, bool underManagementFolder = true) + { + var lines = moduleFile.GetLines(); + + for (var i = 0; i < lines.Length; i++) + { + if (lines[i].Contains("namespace MyCompanyName.MyProjectName")) + { + lines[i - 1] = lines[i - 1] + "using Volo.Abp.LeptonTheme" + (underManagementFolder ? ".Management" : "").EnsureEndsWith(';') + Environment.NewLine; + } + + if (lines[i].Contains("public class MyProjectName") && lines[i-1].Contains(")]")) + { + lines[i - 2] = lines[i - 2] + "," + Environment.NewLine + $"\ttypeof({dependency})"; + } + } + + moduleFile.SetLines(lines); + } + protected void ReplacePackageReferenceWithProjectReference( ProjectBuildContext context, string targetProjectFilePath, string packageReference, string projectReference) { - var file = context.FindFile(targetProjectFilePath); + var file = context.Files.FirstOrDefault(x => x.Name.Contains(targetProjectFilePath)); if (file == null) { return; @@ -490,8 +382,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep string oldKeyword, string newKeyword) { - var file = context.FindFile(targetModuleFilePath); - + var file = context.Files.FirstOrDefault(x => x.Name.Contains(targetModuleFilePath)); if (file == null) { return; @@ -505,7 +396,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep { if (lines[i].Contains($"using {oldNamespace}")) { - lines[i] = $"using {newNamespace};"; + lines[i] = lines[i].Replace($"using {oldNamespace}", $"using {newNamespace}"); } else if (lines[i].Contains(oldKeyword)) { @@ -522,8 +413,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep string oldNamespace, string newNamespace) { - var file = context.FindFile(targetModuleFilePath); - + var file = context.Files.FirstOrDefault(x => x.Name.Contains(targetModuleFilePath)); if (file == null) { return; @@ -534,9 +424,9 @@ public class ChangeThemeStep : ProjectBuildPipelineStep var lines = file.GetLines(); for (var i = 0; i < lines.Length; i++) { - if (lines[i].Contains($"using {oldNamespace};")) + if (lines[i].Contains($"using {oldNamespace}")) { - lines[i] = $"using {newNamespace};"; + lines[i] = lines[i].Replace($"using {oldNamespace}", $"using {newNamespace}"); } } @@ -549,8 +439,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep string oldImportPackage, string newImportPackage) { - var file = context.FindFile(filePath); - + var file = context.Files.FirstOrDefault(x => x.Name.Contains(filePath)); if (file == null) { return; @@ -573,8 +462,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep string filePath, string statement) { - var file = context.FindFile(filePath); - + var file = context.Files.FirstOrDefault(x => x.Name.Contains(filePath)); if (file == null) { return; @@ -600,8 +488,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep string oldMethodName, string newMethodName) { - var file = context.FindFile(filePath); - + var file = context.Files.FirstOrDefault(x => x.Name.Contains(filePath)); if (file == null) { return; @@ -620,4 +507,376 @@ public class ChangeThemeStep : ProjectBuildPipelineStep file.SetLines(lines); } + + private static void AddProjectReference(FileEntry file, string reference) + { + if (!file.Name.Contains(".csproj")) + { + return; + } + + var doc = new XmlDocument() { PreserveWhitespace = true }; + using (var stream = StreamHelper.GenerateStreamFromString(file.Content)) + { + doc.Load(stream); + + var itemGroupNodes = doc.SelectNodes("/Project/ItemGroup"); + XmlNode itemGroupNode = null; + + if (itemGroupNodes == null || itemGroupNodes.Count < 1) + { + var projectNodes = doc.SelectNodes("/Project"); + var projectNode = projectNodes![0]; + + itemGroupNode = doc.CreateElement("ItemGroup"); + projectNode.AppendChild(itemGroupNode); + } + else + { + for (var i = 0; i < itemGroupNodes.Count; i++) + { + if (itemGroupNode is not null) + { + break; + } + for (var j = 0; j < itemGroupNodes[i].ChildNodes.Count; j++) + { + if (itemGroupNodes[i].ChildNodes[j].Name != "ProjectReference" || itemGroupNodes[i].ChildNodes[j].NodeType != XmlNodeType.Element) + { + continue; + } + + itemGroupNode = itemGroupNodes[i]; + break; + } + } + } + + itemGroupNode ??= itemGroupNodes[0]; + + var packageReferenceNode = doc.CreateElement("ProjectReference"); + + var includeAttr = doc.CreateAttribute("Include"); + includeAttr.Value = reference; + packageReferenceNode.Attributes.Append(includeAttr); + + itemGroupNode.AppendChild(doc.CreateTextNode("\t")); + itemGroupNode.AppendChild(packageReferenceNode); + itemGroupNode.AppendChild(doc.CreateTextNode(Environment.NewLine)); + file.SetContent(doc.OuterXml); + } + } + + private static FileEntry ConvertProjectFileToModuleFile(ProjectBuildContext context, FileEntry projectFile) + { + var splittedProjectFileName = projectFile.Name.RemovePostFix("/").Split("/"); + + splittedProjectFileName = splittedProjectFileName.Take(splittedProjectFileName.Length - 1).ToArray(); + + var fileName = splittedProjectFileName?.Last(); + if (fileName == null) + { + return null; + } + + fileName = fileName + .Replace("MyCompanyName.", "") + .Replace(".csproj", "Module") + .Replace(".", ""); + + fileName = ConvertProjectNameToModuleName(fileName); + + return context.Files.FirstOrDefault(f => f.Name.Contains(splittedProjectFileName.Last() + "/" + fileName)); + } + + private static string ConvertProjectNameToModuleName(string moduleName) + { + return moduleName.Replace(".", ""); + } + + private static void RenameLeptonXFolders(ProjectBuildContext context, string folderName) + { + var leptonXFiles = context.Files.Where(x => x.Name.Contains("LeptonX") && x.IsDirectory); + foreach (var file in leptonXFiles) + { + new MoveFolderStep(file.Name, file.Name.Replace("LeptonX", folderName)).Execute(context); + } + } + + private void ChangeThemeToBasicForMvcProjects(ProjectBuildContext context, string defaultThemeName) + { + var projects = new Dictionary + { + {".Web", "MyProjectNameWebModule"}, + {".HttpApi.Host", "MyProjectNameHttpApiHostModule"}, + {".AuthServer", "MyProjectNameAuthServerModule"}, + {"", "MyProjectNameWebModule"} + }; + + foreach (var project in projects) + { + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName{project.Key}/MyCompanyName.MyProjectName{project.Key}.csproj", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}", + @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", + $"AbpAspNetCoreMvcUi{defaultThemeName}ThemeModule", + "AbpAspNetCoreMvcUiBasicThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}.Bundling", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", + $"{defaultThemeName}ThemeBundles.Styles.Global", + "BasicThemeBundles.Styles.Global" + ); + } + } + + private void ChangeThemeToBasicForBlazorServerProjects(ProjectBuildContext context, string defaultThemeName) + { + var projects = new Dictionary + { + {"Blazor", "MyProjectNameBlazorModule"}, + {"Blazor.Server.Tiered", "MyProjectNameBlazorModule"}, + {"Blazor.Server", "MyProjectNameModule"}, + {"Blazor.Server.Mongo", "MyProjectNameModule"} + }; + + foreach (var project in projects) + { + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/MyCompanyName.MyProjectName.{project.Key}.csproj", + $"Volo.Abp.AspNetCore.Components.Server.{defaultThemeName}Theme", + @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" + ); + + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/MyCompanyName.MyProjectName.{project.Key}.csproj", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}", + @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.Server.BasicTheme\Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Components.Server.{defaultThemeName}Theme", + "Volo.Abp.AspNetCore.Components.Server.BasicTheme", + $"AbpAspNetCoreComponentsServer{defaultThemeName}ThemeModule", + "AbpAspNetCoreComponentsServerBasicThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic", + $"AbpAspNetCoreMvcUi{defaultThemeName}ThemeModule", + "AbpAspNetCoreMvcUiBasicThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Components.Server.{defaultThemeName}Theme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", + $"{defaultThemeName}ThemeBundles.Styles.Global", + "BasicThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/{project.Value}.cs", + $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}.Bundling", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling", + $"Blazor{defaultThemeName}ThemeBundles.Styles.Global", + "BlazorBasicThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/Pages/_Host.cshtml", + $"Volo.Abp.AspNetCore.Components.Web.{defaultThemeName}Theme.Themes.{defaultThemeName}", + "Volo.Abp.AspNetCore.Components.Web.BasicTheme.Themes.Basic", + $"Blazor{defaultThemeName}ThemeBundles.Styles.Global", + "BlazorBasicThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{project.Key}/Pages/_Host.cshtml", + $"Volo.Abp.AspNetCore.Components.Server.{defaultThemeName}Theme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.BasicTheme.Bundling", + $"Blazor{defaultThemeName}ThemeBundles.Scripts.Global", + "BlazorBasicThemeBundles.Scripts.Global" + ); + } + } + + private void ChangeThemeToLeptonForBlazorServerProjects(ProjectBuildContext context) + { + var projectNames = new[] {"Blazor", "Blazor.Server.Tiered"}; + foreach (var projectName in projectNames) + { + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyCompanyName.MyProjectName.{projectName}.csproj", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + @"..\..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.csproj" + ); + + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyCompanyName.MyProjectName.{projectName}.csproj", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme", + @"..\..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Components.Server.LeptonTheme\Volo.Abp.AspNetCore.Components.Server.LeptonTheme.csproj" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameBlazorModule.cs", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme", + "AbpAspNetCoreComponentsServerLeptonXThemeModule", + "AbpAspNetCoreComponentsServerLeptonThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameBlazorModule.cs", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton", + "AbpAspNetCoreMvcUiLeptonXThemeModule", + "AbpAspNetCoreMvcUiLeptonThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameBlazorModule.cs", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme.Bundling", + "LeptonXThemeBundles.Styles.Global", + "LeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameBlazorModule.cs", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Bundling", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.Bundling", + "BlazorLeptonXThemeBundles.Styles.Global", + "BlazorLeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/Pages/_Host.cshtml", + "Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components", + "Volo.Abp.AspNetCore.Components.Web.LeptonTheme.Components", + "BlazorLeptonXThemeBundles.Styles.Global", + "BlazorLeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/Pages/_Host.cshtml", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme.Bundling", + "BlazorLeptonXThemeBundles.Scripts.Global", + "BlazorLeptonThemeBundles.Scripts.Global" + ); + } + } + + private void ChangeThemeToLeptonForNoLayersBlazorServerProjects(ProjectBuildContext context) + { + var blazorServerProjects = new[] { "Blazor.Server", "HttpApi", "Application" }; + + var projectNames = new[] { "Blazor.Server", "Blazor.Server.Mongo" }; + foreach (var projectName in projectNames) + { + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyCompanyName.MyProjectName.{projectName}.csproj", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + @"..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.csproj" + ); + + ReplacePackageReferenceWithProjectReference( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyCompanyName.MyProjectName.{projectName}.csproj", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme", + @"..\..\..\..\lepton-theme\src\Volo.Abp.AspNetCore.Components.Server.LeptonTheme\Volo.Abp.AspNetCore.Components.Server.LeptonTheme.csproj" + ); + + ConfigureLeptonManagementPackagesForNoLayersMvc(context, + $@"/MyCompanyName.MyProjectName.{projectName}/MyCompanyName.MyProjectName.{projectName}.csproj", + blazorServerProjects); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameModule.cs", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme", + "AbpAspNetCoreComponentsServerLeptonXThemeModule", + "AbpAspNetCoreComponentsServerLeptonThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameModule.cs", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton", + "AbpAspNetCoreMvcUiLeptonXThemeModule", + "AbpAspNetCoreMvcUiLeptonThemeModule" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameModule.cs", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme.Bundling", + "LeptonXThemeBundles.Styles.Global", + "LeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/MyProjectNameModule.cs", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonX.Bundling", + "Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton.Bundling", + "BlazorLeptonXThemeBundles.Styles.Global", + "BlazorLeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/Pages/_Host.cshtml", + "Volo.Abp.AspNetCore.Components.Web.LeptonXTheme.Components", + "Volo.Abp.AspNetCore.Components.Web.LeptonTheme.Components", + "BlazorLeptonXThemeBundles.Styles.Global", + "BlazorLeptonThemeBundles.Styles.Global" + ); + + ChangeNamespaceAndKeyword( + context, + $"/MyCompanyName.MyProjectName.{projectName}/Pages/_Host.cshtml", + "Volo.Abp.AspNetCore.Components.Server.LeptonXTheme.Bundling", + "Volo.Abp.AspNetCore.Components.Server.LeptonTheme.Bundling", + "BlazorLeptonXThemeBundles.Scripts.Global", + "BlazorLeptonThemeBundles.Scripts.Global" + ); + } + } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStyleStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStyleStep.cs new file mode 100644 index 0000000000..ef6a1e9474 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStyleStep.cs @@ -0,0 +1,76 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; + +public class ChangeThemeStyleStep : ProjectBuildPipelineStep +{ + public override void Execute(ProjectBuildContext context) + { + if (context.BuildArgs.Theme != Theme.LeptonX) + { + return; + } + + switch (context.BuildArgs.ThemeStyle) + { + case ThemeStyle.Light: + ChangeThemeStyle(context, themeStyleName: "Light"); + break; + case ThemeStyle.Dark: + ChangeThemeStyle(context, themeStyleName: "Dark"); + break; + } + } + + private void ChangeThemeStyle(ProjectBuildContext context, string themeStyleName) + { + var defaultThemeStyleName = "LeptonXStyleNames.Dim"; + var newThemeStyleName = $"LeptonXStyleNames.{themeStyleName}"; + + var filePaths = new List + { + "/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs", + "/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebModule.cs", + "/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs", + "/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs", + "/MyCompanyName.MyProjectName.Blazor/MyProjectNameBlazorModule.cs", + "/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameBlazorModule.cs", + "/MyCompanyName.MyProjectName.Blazor.Server/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Host/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Host.Mongo/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Mvc/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Mvc.Mongo/MyProjectNameModule.cs", + "/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyProjectNameBlazorModule.cs", + "/MyCompanyName.MyProjectName.AuthServer/MyProjectNameAuthServerModule.cs", + }; + + foreach(var filePath in filePaths) + { + ChangeThemeStyleName(context, filePath, defaultThemeStyleName, newThemeStyleName); + } + } + + protected void ChangeThemeStyleName(ProjectBuildContext context, string filePath, string oldThemeStyleName, string newThemeStyleName) + { + var file = context.Files.FirstOrDefault(x => x.Name.Contains(filePath)); + if (file == null) + { + return; + } + + file.NormalizeLineEndings(); + + var lines = file.GetLines(); + for (var i = 0; i < lines.Length; i++) + { + if (lines[i].Contains(oldThemeStyleName)) + { + lines[i] = lines[i].Replace(oldThemeStyleName, newThemeStyleName); + } + } + + file.SetLines(lines); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveDependencyFromPackageJsonFileStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveDependencyFromPackageJsonFileStep.cs index 00f7629f52..3eabb6621e 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveDependencyFromPackageJsonFileStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveDependencyFromPackageJsonFileStep.cs @@ -17,7 +17,7 @@ public class RemoveDependencyFromPackageJsonFileStep : ProjectBuildPipelineStep public override void Execute(ProjectBuildContext context) { - var packageJsonFile = context.Files.FirstOrDefault(f => f.Name == _packageJsonFilePath); + var packageJsonFile = context.Files.FirstOrDefault(f => f.Name.Contains(_packageJsonFilePath)); if (packageJsonFile == null) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Theme.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Theme.cs index bc2ba89589..1ef1c0da55 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Theme.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Theme.cs @@ -1,7 +1,10 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building; -public enum Theme +public enum Theme : byte { - LeptonXLite = 0, - Basic = 1 + NotSpecified = 0, + Basic = 1, + Lepton = 2, + LeptonXLite = 3, + LeptonX = 4 } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ThemeStyle.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ThemeStyle.cs new file mode 100644 index 0000000000..e9a8804f70 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ThemeStyle.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.Cli.ProjectBuilding.Building; +public enum ThemeStyle : byte +{ + NotSpecified = 0, + Dim = 1, + Light = 2, + Dark = 3 +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs index 18edb71863..b4b4429767 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs @@ -44,6 +44,8 @@ public class ProjectBuildArgs public Theme? Theme { get; set; } + public ThemeStyle? ThemeStyle { get; set; } + [NotNull] public Dictionary ExtraProperties { get; set; } @@ -63,7 +65,8 @@ public class ProjectBuildArgs Dictionary extraProperties = null, [CanBeNull] string connectionString = null, bool pwa = false, - Theme? theme = null) + Theme? theme = null, + ThemeStyle? themeStyle = null) { SolutionName = Check.NotNull(solutionName, nameof(solutionName)); TemplateName = templateName; @@ -81,5 +84,6 @@ public class ProjectBuildArgs ConnectionString = connectionString; Pwa = pwa; Theme = theme; + ThemeStyle = themeStyle; } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersProTemplate.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersProTemplate.cs index 7e7be0143f..73f00882bf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersProTemplate.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersProTemplate.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; public class AppNoLayersProTemplate : AppNoLayersTemplateBase { @@ -6,6 +8,8 @@ public class AppNoLayersProTemplate : AppNoLayersTemplateBase /// "app-nolayers-pro". /// public const string TemplateName = "app-nolayers-pro"; + + public const Theme DefaultTheme = Theme.LeptonX; public AppNoLayersProTemplate() : base(TemplateName) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplate.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplate.cs index 24119c43f2..d8bcdfe3f3 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplate.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplate.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; public class AppNoLayersTemplate : AppNoLayersTemplateBase { @@ -7,6 +9,8 @@ public class AppNoLayersTemplate : AppNoLayersTemplateBase /// public const string TemplateName = "app-nolayers"; + public const Theme DefaultTheme = Theme.LeptonXLite; + public AppNoLayersTemplate() : base(TemplateName) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppProTemplate.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppProTemplate.cs index 25a4797f7d..d9f32ee834 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppProTemplate.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppProTemplate.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; public class AppProTemplate : AppTemplateBase { @@ -6,6 +8,8 @@ public class AppProTemplate : AppTemplateBase /// "app-pro". /// public const string TemplateName = "app-pro"; + + public const Theme DefaultTheme = Theme.LeptonX; public AppProTemplate() : base(TemplateName) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs index 8c533b1d94..ae9516f597 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplate.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; public class AppTemplate : AppTemplateBase { @@ -6,6 +8,8 @@ public class AppTemplate : AppTemplateBase /// "app". /// public const string TemplateName = "app"; + + public const Theme DefaultTheme = Theme.LeptonXLite; public AppTemplate() : base(TemplateName) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index eea25e6844..fb1fc79399 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; +using System.Linq; using NuGet.Versioning; using Volo.Abp.Cli.Commands; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building.Steps; +using Volo.Abp.Cli.ProjectBuilding.Templates.Microservice; namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; @@ -183,55 +185,76 @@ public abstract class AppTemplateBase : TemplateInfo { return; } - - if (context.BuildArgs.Theme != Theme.LeptonXLite) + + if (context.BuildArgs.Theme == Theme.LeptonX) { - steps.Add(new ChangeThemeStep()); - RemoveLeptonXThemePackagesFromPackageJsonFiles(steps); + context.Symbols.Add("LEPTONX"); + steps.Add(new ChangeThemeStyleStep()); } + + if (IsDefaultThemeForTemplate(context.BuildArgs.Theme.Value)) + { + return; + } + + steps.Add(new ChangeThemeStep()); + RemoveLeptonXThemePackagesFromPackageJsonFiles(steps, isProTemplate: IsPro()); } - private void RemoveLeptonXThemePackagesFromPackageJsonFiles(List steps) + private static bool IsDefaultThemeForTemplate(Theme theme) { - var packageJsonFilePaths = new List() - { - "/aspnet-core/src/MyCompanyName.MyProjectName.Web/package.json", - "/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/package.json", - "/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json", - "/aspnet-core/src/MyCompanyName.MyProjectName.AuthServer/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Mvc/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Mvc.Mongo/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Host/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Host.Mongo/package.json", + var defaultThemesForTemplates = new[] + { + AppTemplate.DefaultTheme, AppProTemplate.DefaultTheme, + AppNoLayersTemplate.DefaultTheme, AppNoLayersProTemplate.DefaultTheme + }; + + return defaultThemesForTemplates.Any(defaultTheme => defaultTheme == theme); + } + + private static void RemoveLeptonXThemePackagesFromPackageJsonFiles(List steps, bool isProTemplate) + { + var packageJsonFilePaths = new List + { + "/MyCompanyName.MyProjectName.Web/package.json", + "/MyCompanyName.MyProjectName.Web.Host/package.json", + "/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json", + "/MyCompanyName.MyProjectName.AuthServer/package.json", + "/MyCompanyName.MyProjectName/package.json", + "/MyCompanyName.MyProjectName.Host/package.json", + "/MyCompanyName.MyProjectName.Host.Mongo/package.json" }; - var blazorServerPackageJsonFilePaths = new List() + var blazorServerPackageJsonFilePaths = new List { - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/package.json", - "/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/package.json", - "/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json" + "/MyCompanyName.MyProjectName.Blazor.Server/package.json", + "/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json", + "/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json" }; - var angularPackageJsonFilePaths = new List() + var angularPackageJsonFilePaths = new List { "/angular/package.json" }; + var mvcUiPackageName = isProTemplate ? "@volo/abp.aspnetcore.mvc.ui.theme.leptonx" : "@abp/aspnetcore.mvc.ui.theme.leptonxlite"; + var blazorServerUiPackageName = isProTemplate ? "@volo/aspnetcore.components.server.leptonxtheme" : "@abp/aspnetcore.components.server.leptonxlitetheme"; + var ngUiPackageName = isProTemplate ? "@volosoft/abp.ng.theme.lepton-x" : "@abp/ng.theme.lepton-x"; + foreach (var packageJsonFilePath in packageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(packageJsonFilePath, "@abp/aspnetcore.mvc.ui.theme.leptonxlite")); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName)); } foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, "@abp/aspnetcore.mvc.ui.theme.leptonxlite")); - steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, "@abp/aspnetcore.components.server.leptonxlitetheme")); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName)); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, blazorServerUiPackageName)); } foreach (var angularPackageJsonFilePath in angularPackageJsonFilePaths) { - steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "@abp/ng.theme.lepton-x")); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName)); steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceProTemplate.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceProTemplate.cs index 6741a142dd..43b0884835 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceProTemplate.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceProTemplate.cs @@ -1,4 +1,6 @@ -namespace Volo.Abp.Cli.ProjectBuilding.Templates.Microservice; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.Microservice; public class MicroserviceProTemplate : MicroserviceTemplateBase { @@ -7,6 +9,8 @@ public class MicroserviceProTemplate : MicroserviceTemplateBase /// public const string TemplateName = "microservice-pro"; + public const Theme DefaultTheme = Theme.LeptonX; + public MicroserviceProTemplate() : base(TemplateName) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs index 309afae446..71f090a576 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs @@ -24,9 +24,68 @@ public abstract class MicroserviceTemplateBase : TemplateInfo DeleteUnrelatedProjects(context, steps); RandomizeStringEncryption(context, steps); UpdateNuGetConfig(context, steps); + ConfigureTheme(context, steps); return steps; } + + protected void ConfigureTheme(ProjectBuildContext context, List steps) + { + if (!context.BuildArgs.Theme.HasValue) + { + return; + } + + if (context.BuildArgs.Theme == Theme.LeptonX) + { + context.Symbols.Add("LEPTONX"); + steps.Add(new ChangeThemeStyleStep()); + return; + } + + steps.Add(new ChangeThemeStep()); + RemoveLeptonXThemePackagesFromPackageJsonFiles(steps); + } + + private static void RemoveLeptonXThemePackagesFromPackageJsonFiles(List steps) + { + var packageJsonFilePaths = new List + { + "/MyCompanyName.MyProjectName.AuthServer/package.json", + "/MyCompanyName.MyProjectName.Web/package.json" + }; + + var blazorServerPackageJsonFilePaths = new List + { + "/MyCompanyName.MyProjectName.Blazor.Server/package.json" + }; + + var angularPackageJsonFilePaths = new List + { + "/angular/package.json" + }; + + var mvcUiPackageName = "@volo/abp.aspnetcore.mvc.ui.theme.leptonx"; + var blazorServerUiPackageName = "@volo/aspnetcore.components.server.leptonxtheme"; + var ngUiPackageName = "@volosoft/abp.ng.theme.lepton-x"; + + foreach (var packageJsonFilePath in packageJsonFilePaths) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName)); + } + + foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName)); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, blazorServerUiPackageName)); + } + + foreach (var angularPackageJsonFilePath in angularPackageJsonFilePaths) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName)); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); + } + } private static void DeleteUnrelatedProjects(ProjectBuildContext context, List steps) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ExceptionMessageHelper.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ExceptionMessageHelper.cs new file mode 100644 index 0000000000..dd78be14db --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Utils/ExceptionMessageHelper.cs @@ -0,0 +1,6 @@ +namespace Volo.Abp.Cli.Utils; + +public static class ExceptionMessageHelper +{ + public static string GetInvalidOptionExceptionMessage(string optionName) => $"The option you provided for {optionName} is invalid!"; +} \ No newline at end of file