-
-
+
+
-
- {{ feature.displayName }}
+
+ {{ feature.displayName }}
diff --git a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts
index c225060370..71e5ae834e 100644
--- a/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts
+++ b/npm/ng-packs/packages/feature-management/src/lib/components/feature-management/feature-management.component.ts
@@ -119,6 +119,70 @@ export class FeatureManagementComponent
}
});
}
+
+ onCheckboxClick(val: boolean, feature: FeatureDto) {
+ if (val) {
+ this.checkToggleAncestors(feature);
+ } else {
+ this.uncheckToggleDescendants(feature);
+ }
+ }
+
+ private uncheckToggleDescendants(feature: FeatureDto) {
+ this.findAllDescendantsOfByType(feature, ValueTypes.ToggleStringValueType).forEach(node =>
+ this.setFeatureValue(node, false),
+ );
+ }
+
+ private checkToggleAncestors(feature: FeatureDto) {
+ this.findAllAncestorsOfByType(feature, ValueTypes.ToggleStringValueType).forEach(node =>
+ this.setFeatureValue(node, true),
+ );
+ }
+
+ private findAllAncestorsOfByType(feature: FeatureDto, type: ValueTypes) {
+ let parent = this.findParentByType(feature, type);
+ const ancestors = [];
+ while (parent) {
+ ancestors.push(parent);
+ parent = this.findParentByType(parent, type);
+ }
+ return ancestors;
+ }
+
+ private findAllDescendantsOfByType(feature: FeatureDto, type: ValueTypes) {
+ const descendants = [];
+ const queue = [feature];
+
+ while (queue.length) {
+ const node = queue.pop();
+ const newDescendants = this.findChildrenByType(node, type);
+ descendants.push(...newDescendants);
+ queue.push(...newDescendants);
+ }
+
+ return descendants;
+ }
+
+ private findParentByType(feature: FeatureDto, type: ValueTypes) {
+ return this.getCurrentGroup().find(
+ f => f.valueType.name === type && f.name === feature.parentName,
+ );
+ }
+
+ private findChildrenByType(feature: FeatureDto, type: ValueTypes) {
+ return this.getCurrentGroup().filter(
+ f => f.valueType.name === type && f.parentName === feature.name,
+ );
+ }
+
+ private getCurrentGroup() {
+ return this.features[this.selectedGroupDisplayName] ?? [];
+ }
+
+ private setFeatureValue(feature: FeatureDto, val: boolean) {
+ feature.value = val as any;
+ }
}
function mapFeatures(features: FeatureDto[], dir: LocaleDirection) {
diff --git a/npm/ng-packs/packages/feature-management/src/lib/directives/free-text-input.directive.ts b/npm/ng-packs/packages/feature-management/src/lib/directives/free-text-input.directive.ts
new file mode 100644
index 0000000000..f72729375a
--- /dev/null
+++ b/npm/ng-packs/packages/feature-management/src/lib/directives/free-text-input.directive.ts
@@ -0,0 +1,38 @@
+import { Directive, Input, HostBinding } from '@angular/core';
+
+// TODO: improve this type
+export interface FreeTextType {
+ valueType: {
+ validator: {
+ name: string;
+ };
+ };
+}
+
+export const INPUT_TYPES = {
+ numeric: 'number',
+ default: 'text',
+};
+
+@Directive({
+ selector: 'input[abpFeatureManagementFreeText]',
+ exportAs: 'inputAbpFeatureManagementFreeText',
+})
+export class FreeTextInputDirective {
+ _feature: FreeTextType;
+ @Input('abpFeatureManagementFreeText') set feature(val: FreeTextType) {
+ this._feature = val;
+ this.setInputType();
+ }
+
+ get feature() {
+ return this._feature;
+ }
+
+ @HostBinding('type') type: string;
+
+ private setInputType() {
+ const validatorType = this.feature?.valueType?.validator?.name.toLowerCase();
+ this.type = INPUT_TYPES[validatorType] ?? INPUT_TYPES.default;
+ }
+}
diff --git a/npm/ng-packs/packages/feature-management/src/lib/directives/index.ts b/npm/ng-packs/packages/feature-management/src/lib/directives/index.ts
new file mode 100644
index 0000000000..ec7eef1ded
--- /dev/null
+++ b/npm/ng-packs/packages/feature-management/src/lib/directives/index.ts
@@ -0,0 +1 @@
+export * from './free-text-input.directive';
diff --git a/npm/ng-packs/packages/feature-management/src/lib/feature-management.module.ts b/npm/ng-packs/packages/feature-management/src/lib/feature-management.module.ts
index 0a3d3b822e..4061965085 100644
--- a/npm/ng-packs/packages/feature-management/src/lib/feature-management.module.ts
+++ b/npm/ng-packs/packages/feature-management/src/lib/feature-management.module.ts
@@ -1,19 +1,22 @@
import { CoreModule } from '@abp/ng.core';
import { ThemeSharedModule } from '@abp/ng.theme.shared';
import { NgModule } from '@angular/core';
-import { FeatureManagementComponent } from './components/feature-management/feature-management.component';
import { NgxsModule } from '@ngxs/store';
-import { FeatureManagementState } from './states/feature-management.state';
import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
+import { FreeTextInputDirective } from './directives/free-text-input.directive';
+import { FeatureManagementComponent } from './components/feature-management/feature-management.component';
+import { FeatureManagementState } from './states/feature-management.state';
+
+const exported = [FeatureManagementComponent, FreeTextInputDirective];
@NgModule({
- declarations: [FeatureManagementComponent],
+ declarations: [...exported],
imports: [
CoreModule,
ThemeSharedModule,
NgbNavModule,
NgxsModule.forFeature([FeatureManagementState]),
],
- exports: [FeatureManagementComponent],
+ exports: [...exported],
})
export class FeatureManagementModule {}
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/fr.json b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/fr.json
new file mode 100644
index 0000000000..e76eac0c71
--- /dev/null
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/fr.json
@@ -0,0 +1,8 @@
+{
+ "culture": "fr",
+ "texts": {
+ "Menu:Home": "Accueil",
+ "Welcome": "Bienvenue",
+ "LongWelcomeMessage": "Bienvenue dans l'application. Il s'agit d'un projet de démarrage basé sur le framework ABP. Pour plus d'informations, visitez abp.io."
+ }
+}
\ No newline at end of file
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
index b217a0ada7..14babd4642 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
@@ -115,6 +115,7 @@ namespace MyCompanyName.MyProjectName
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
+ options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs
index 25d1598438..405867b7fe 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs
@@ -119,6 +119,7 @@ namespace MyCompanyName.MyProjectName
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
+ options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
index 8a4e919161..8054d31d6a 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
@@ -61,6 +61,7 @@ namespace MyCompanyName.MyProjectName
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
+ options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
diff --git a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs
index e9bf54a468..8437aed2d6 100644
--- a/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs
+++ b/templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs
@@ -145,6 +145,7 @@ namespace MyCompanyName.MyProjectName.Web
options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
+ options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
index 0145f8a41a..e810932935 100644
--- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
+++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs
@@ -91,6 +91,7 @@ namespace MyCompanyName.MyProjectName
{
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
+ options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
index 00b3d7b06d..f257857d18 100644
--- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
+++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs
@@ -102,6 +102,7 @@ namespace MyCompanyName.MyProjectName
{
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
+ options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
diff --git a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs
index 7cb5e9a28f..f9c81d727f 100644
--- a/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs
+++ b/templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified/MyProjectNameWebUnifiedModule.cs
@@ -99,6 +99,7 @@ namespace MyCompanyName.MyProjectName
{
options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
options.Languages.Add(new LanguageInfo("en", "en", "English"));
+ options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português (Brasil)"));
options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
diff --git a/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/fr.json b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/fr.json
new file mode 100644
index 0000000000..8343c737bf
--- /dev/null
+++ b/templates/module/aspnet-core/src/MyCompanyName.MyProjectName.Domain.Shared/Localization/MyProjectName/fr.json
@@ -0,0 +1,7 @@
+{
+ "culture": "fr",
+ "texts": {
+ "ManageYourProfile": "Gérer votre profil",
+ "SamplePageMessage": "Exemple de page pour le module MyProjectName"
+ }
+}
\ No newline at end of file