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 44b9c20423..10063b84e5 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 @@ -132,11 +132,11 @@ public abstract class AppTemplateBase : TemplateInfo case UiFramework.BlazorServer: ConfigureWithBlazorServerUi(context, steps); break; - + case UiFramework.MauiBlazor: ConfigureWithMauiBlazorUi(context, steps); break; - + case UiFramework.Mvc: case UiFramework.NotSpecified: ConfigureWithMvcUi(context, steps); @@ -213,14 +213,14 @@ public abstract class AppTemplateBase : TemplateInfo { steps.Add(new ChangeThemeStyleStep()); } - + RemoveThemeLogoFolders(context, steps); - + if (IsDefaultThemeForTemplate(context.BuildArgs.Theme.Value)) { return; } - + steps.Add(new ChangeThemeStep()); RemoveLeptonXThemePackagesFromPackageJsonFiles(steps, isProTemplate: IsPro(), uiFramework: context.BuildArgs.UiFramework); } @@ -240,15 +240,15 @@ public abstract class AppTemplateBase : TemplateInfo private static bool IsDefaultThemeForTemplate(Theme theme) { - var defaultThemesForTemplates = new[] + var defaultThemesForTemplates = new[] { - AppTemplate.DefaultTheme, AppProTemplate.DefaultTheme, + AppTemplate.DefaultTheme, AppProTemplate.DefaultTheme, AppNoLayersTemplate.DefaultTheme, AppNoLayersProTemplate.DefaultTheme }; - + return defaultThemesForTemplates.Any(defaultTheme => defaultTheme == theme); } - + private static void RemoveLeptonXThemePackagesFromPackageJsonFiles(List steps, bool isProTemplate, UiFramework uiFramework) { var mvcUiPackageName = isProTemplate ? "@volo/abp.aspnetcore.mvc.ui.theme.leptonx" : "@abp/aspnetcore.mvc.ui.theme.leptonxlite"; @@ -263,7 +263,7 @@ public abstract class AppTemplateBase : TemplateInfo "/MyCompanyName.MyProjectName.Host/package.json", "/MyCompanyName.MyProjectName.Host.Mongo/package.json" }; - + foreach (var packageJsonFilePath in packageJsonFilePaths) { steps.Add(new RemoveDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName)); @@ -278,7 +278,7 @@ public abstract class AppTemplateBase : TemplateInfo "/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json", "/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json" }; - + foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths) { steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName)); @@ -288,11 +288,11 @@ public abstract class AppTemplateBase : TemplateInfo else if (uiFramework == UiFramework.Angular) { var ngUiPackageName = isProTemplate ? "@volosoft/abp.ng.theme.lepton-x" : "@abp/ng.theme.lepton-x"; - var angularPackageJsonFilePaths = new List + var angularPackageJsonFilePaths = new List { "/angular/package.json" }; - + foreach (var angularPackageJsonFilePath in angularPackageJsonFilePaths) { steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName)); @@ -527,6 +527,7 @@ public abstract class AppTemplateBase : TemplateInfo steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests")); + steps.Add(new RemoveFileStep("/aspnet-core/src/MyCompanyName.MyProjectName.MauiBlazor/Directory.Build.props")); if (context.BuildArgs.ExtraProperties.ContainsKey("separate-identity-server") || context.BuildArgs.ExtraProperties.ContainsKey("separate-auth-server")) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor index 70bff838c7..719cea562a 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor @@ -6,15 +6,15 @@ @L["Features"] - + - - @if (Groups == null || !Groups.Any()) - { - @L["NoFeatureFoundMessage"] - } - else - { + @if (Groups == null || !Groups.Any()) + { + @L["NoFeatureFoundMessage"] + } + else + { + @foreach (var group in Groups) @@ -30,7 +30,7 @@ var index = i;

@Groups[index].DisplayName

-
+
@foreach (var feature in Groups[index].Features) {
@@ -42,8 +42,8 @@ @feature.DisplayName + Text="@feature.Value" + TextChanged="@(async (v) => await OnFeatureValueChangedAsync(v, feature))" /> @if (feature.Description != null) {
@feature.Description
@@ -53,12 +53,12 @@ if (feature.ValueType is SelectionStringValueType) { - var items = ((SelectionStringValueType) feature.ValueType).ItemSource.Items; + var items = ((SelectionStringValueType)feature.ValueType).ItemSource.Items; @feature.DisplayName + + +
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/password/password.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/password/password.component.ts new file mode 100644 index 0000000000..74020240a1 --- /dev/null +++ b/npm/ng-packs/packages/theme-shared/src/lib/components/password/password.component.ts @@ -0,0 +1,28 @@ +import { Component, forwardRef, Injector, Input } from '@angular/core'; +import { AbstractNgModelComponent } from '@abp/ng.core'; +import { NG_VALUE_ACCESSOR } from '@angular/forms'; + +@Component({ + selector: 'abp-password', + templateUrl: `password.component.html`, + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => PasswordComponent), + multi: true, + }, + ], +}) +export class PasswordComponent extends AbstractNgModelComponent { + @Input() inputId!: string; + @Input() formControlName!: string; + fieldTextType: boolean; + + constructor(injector: Injector) { + super(injector); + } + + toggleFieldTextType() { + this.fieldTextType = !this.fieldTextType; + } +} diff --git a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts index 6240925054..fd9a0cd236 100644 --- a/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts +++ b/npm/ng-packs/packages/theme-shared/src/lib/theme-shared.module.ts @@ -32,9 +32,10 @@ import { RootParams } from './models/common'; import { NG_BOOTSTRAP_CONFIG_PROVIDERS } from './providers'; import { THEME_SHARED_ROUTE_PROVIDERS } from './providers/route.provider'; import { THEME_SHARED_APPEND_CONTENT } from './tokens/append-content.token'; -import { httpErrorConfigFactory, HTTP_ERROR_CONFIG } from './tokens/http-error.token'; +import { HTTP_ERROR_CONFIG, httpErrorConfigFactory } from './tokens/http-error.token'; import { DateParserFormatter } from './utils/date-parser-formatter'; import { CONFIRMATION_ICONS, DEFAULT_CONFIRMATION_ICONS } from './tokens/confirmation-icons.token'; +import { PasswordComponent } from './components/password/password.component'; const declarationsWithExports = [ BreadcrumbComponent, @@ -46,6 +47,7 @@ const declarationsWithExports = [ ModalComponent, ToastComponent, ToastContainerComponent, + PasswordComponent, NgxDatatableDefaultDirective, NgxDatatableListDirective, LoadingDirective, @@ -61,7 +63,7 @@ const declarationsWithExports = [ EllipsisModule, ], declarations: [...declarationsWithExports, HttpErrorWrapperComponent], - exports: [NgxDatatableModule, EllipsisModule, ...declarationsWithExports], + exports: [NgxDatatableModule, EllipsisModule, NgxValidateCoreModule, ...declarationsWithExports], providers: [DatePipe], }) export class BaseThemeSharedModule {}