From fca2c99457779f1ee0a96d43b83362d86c66787d Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 11 Apr 2025 18:06:38 +0800 Subject: [PATCH 1/7] Disable features if the value is not from the current provider. --- .../Components/FeatureManagementModal.razor | 4 +- .../Abp/FeatureManagement/FeatureManager.cs | 2 +- .../FeatureManagementModal.cshtml | 86 ++++++++++--------- .../FeatureManagementModal.cshtml.cs | 10 ++- .../feature-management-modal.css | 14 ++- .../Abp/SettingManagement/SettingManager.cs | 2 +- 6 files changed, 70 insertions(+), 48 deletions(-) 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 77f5018e10..7e00ecf3c3 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 @@ -57,7 +57,7 @@ var selectedValue = SelectionStringValues[feature.Name]; @feature.DisplayName - @foreach (var item in items) { @@ -75,7 +75,7 @@ if (feature.ValueType is ToggleStringValueType) { - + @feature.DisplayName @if (feature.Description != null) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs index 9805f03752..7227d8d82d 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs @@ -152,7 +152,7 @@ public class FeatureManager : IFeatureManager, ISingletonDependency await using (await providers[0].HandleContextAsync(providerName, providerKey)) { var fallbackValue = await GetOrNullInternalAsync(name, providers[1].Name, null); - if (fallbackValue.Value == value) + if (fallbackValue.Value.Equals(value, StringComparison.OrdinalIgnoreCase)) { //Clear the value if it's same as it's fallback value value = null; diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml index c55399d582..f8372a2ed8 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -51,20 +51,21 @@ @if (feature.ValueType is ToggleStringValueType) { - - - @if (feature.Description != null) - { -
@feature.Description
- } +
+ + @if (feature.Description != null) + { +
@feature.Description
+ } +
} @if (feature.ValueType is FreeTextStringValueType) @@ -74,42 +75,45 @@ { type = "number"; } - - - @if (feature.Description != null) - { -
@feature.Description
- } +
+ + @if (feature.Description != null) + { +
@feature.Description
+ } +
} @if (feature.ValueType is SelectionStringValueType selectType) { -
- +
+
+ - + @foreach (var item in selectType.ItemSource.Items) { - + if (item.Value == feature.Value) + { + + } + else + { + + } } + + @if (feature.Description != null) + { +
@feature.Description
} - - @if (feature.Description != null) - { -
@feature.Description
- } +
} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs index f08d42cfd2..edebca2fa0 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs @@ -25,9 +25,9 @@ public class FeatureManagementModal : AbpPageModel [HiddenInput] [BindProperty(SupportsGet = true)] public string ProviderKey { get; set; } - + [HiddenInput] - [BindProperty(SupportsGet = true)] + [BindProperty(SupportsGet = true)] public string ProviderKeyDisplayName { get; set; } [BindProperty] @@ -85,6 +85,12 @@ public class FeatureManagementModal : AbpPageModel return NoContent(); } + public bool IsDisabled(FeatureDto featureDto) + { + return featureDto.Provider.Name != ProviderName && + featureDto.Provider.Name != DefaultValueFeatureValueProvider.ProviderName; + } + public class FeatureGroupViewModel { public List Features { get; set; } diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.css b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.css index 615db50fb4..bcd176ce51 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.css +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.css @@ -5,4 +5,16 @@ .custom-scroll-container > .col-md-4 { max-height: 500px; -} \ No newline at end of file +} + +.disabled-container { + pointer-events: none; + opacity: 0.5; +} + +.disabled-container input, +.disabled-container select, +.disabled-container button { + background-color: #e9ecef; + color: #6c757d; +} diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs index ddf451154d..f0c9df17fd 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs @@ -136,7 +136,7 @@ public class SettingManager : ISettingManager, ISingletonDependency if (providers.Count > 1 && !forceToSet && setting.IsInherited && value != null) { var fallbackValue = await GetOrNullInternalAsync(name, providers[1].Name, null); - if (fallbackValue == value) + if (fallbackValue.Equals(value, StringComparison.OrdinalIgnoreCase)) { //Clear the value if it's same as it's fallback value value = null; From 36cb1f54cebb0a72b1b4aebd773af4b00fd70551 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 11 Apr 2025 18:15:12 +0800 Subject: [PATCH 2/7] Update FeatureManagementModal.cshtml.cs --- .../Pages/FeatureManagement/FeatureManagementModal.cshtml.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs index edebca2fa0..4d20c41602 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs @@ -87,8 +87,7 @@ public class FeatureManagementModal : AbpPageModel public bool IsDisabled(FeatureDto featureDto) { - return featureDto.Provider.Name != ProviderName && - featureDto.Provider.Name != DefaultValueFeatureValueProvider.ProviderName; + return featureDto.Provider.Name != ProviderName && featureDto.Provider.Name != DefaultValueFeatureValueProvider.ProviderName; } public class FeatureGroupViewModel From 6991515d6d2dde457e24e2d5d9c55cf49e916e3a Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 12 Apr 2025 15:09:38 +0800 Subject: [PATCH 3/7] Refactor feature management modal to simplify disabled state handling and remove unused CSS styles --- .../FeatureManagementModal.cshtml | 78 +++++++++---------- .../feature-management-modal.css | 15 +--- 2 files changed, 38 insertions(+), 55 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml index f8372a2ed8..9b8aeaef5c 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -51,21 +51,20 @@ @if (feature.ValueType is ToggleStringValueType) { -
- + - @if (feature.Description != null) - { -
@feature.Description
- } -
+ @if (feature.Description != null) + { +
@feature.Description
+ } } @if (feature.ValueType is FreeTextStringValueType) @@ -75,45 +74,42 @@ { type = "number"; } -
- - @if (feature.Description != null) - { -
@feature.Description
- } -
+ group-style="margin-inline-start: @(feature.Depth * 25)px"/> + @if (feature.Description != null) + { +
@feature.Description
+ } } @if (feature.ValueType is SelectionStringValueType selectType) { -
-
- - - + @foreach (var item in selectType.ItemSource.Items) + { + if (item.Value == feature.Value) { - if (item.Value == feature.Value) - { - - } - else - { - - } + + } + else + { + } - - @if (feature.Description != null) - { -
@feature.Description
} -
+ + @if (feature.Description != null) + { +
@feature.Description
+ }
} diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.css b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.css index bcd176ce51..091315b6d5 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.css +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.css @@ -2,19 +2,6 @@ max-height: 400px; } - .custom-scroll-container > .col-md-4 { max-height: 500px; -} - -.disabled-container { - pointer-events: none; - opacity: 0.5; -} - -.disabled-container input, -.disabled-container select, -.disabled-container button { - background-color: #e9ecef; - color: #6c757d; -} +} \ No newline at end of file From a4b730fb4efa1c909f2b85e26a8e4aec7b31cb51 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 12 Apr 2025 15:19:29 +0800 Subject: [PATCH 4/7] Update feature management modal to filter features based on value presence and change BoolValue to nullable --- .../Pages/FeatureManagement/FeatureManagementModal.cshtml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs index 4d20c41602..a96a0c0f88 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs @@ -69,7 +69,7 @@ public class FeatureManagementModal : AbpPageModel { var features = new UpdateFeaturesDto { - Features = FeatureGroups.SelectMany(g => g.Features).Select(f => new UpdateFeatureDto + Features = FeatureGroups.SelectMany(g => g.Features).Where(x => !x.Value.IsNullOrWhiteSpace() || x.BoolValue.HasValue).Select(f => new UpdateFeatureDto { Name = f.Name, Value = f.Type == nameof(ToggleStringValueType) ? f.BoolValue.ToString() : f.Value @@ -101,7 +101,7 @@ public class FeatureManagementModal : AbpPageModel public string Value { get; set; } - public bool BoolValue { get; set; } + public bool? BoolValue { get; set; } public string Type { get; set; } } From 7304a0555b335170cb48ac5eb7b02fa538fd86ec Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 12 Apr 2025 16:44:55 +0800 Subject: [PATCH 5/7] Refactor feature management modal to improve disabled state handling and update feature selection logic --- .../FeatureManagementModal.cshtml | 63 ++++++++----------- .../FeatureManagementModal.cshtml.cs | 6 +- 2 files changed, 30 insertions(+), 39 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml index 9b8aeaef5c..b6782249ab 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml @@ -45,23 +45,23 @@ @for (var j = 0; j < featureGroup.Features.Count; j++) { var feature = featureGroup.Features[j]; + var disabled = Model.IsDisabled(feature);
+ - @if (feature.ValueType is ToggleStringValueType) { - - - @if (feature.Description != null) + + if (feature.Description != null) {
@feature.Description
} @@ -69,20 +69,16 @@ @if (feature.ValueType is FreeTextStringValueType) { - var type = "text"; - if(feature.ValueType.Validator is NumericValueValidator) - { - type = "number"; - } - - @if (feature.Description != null) + var type = feature.ValueType.Validator is NumericValueValidator ? "number" : "text"; + + if (feature.Description != null) {
@feature.Description
} @@ -90,20 +86,13 @@ @if (feature.ValueType is SelectionStringValueType selectType) { - var disabled = Model.IsDisabled(feature) ? "disabled" : "";
- @foreach (var item in selectType.ItemSource.Items) { - if (item.Value == feature.Value) - { - - } - else - { - - } + var selected = item.Value == feature.Value ? "selected=\"selected\"" : ""; + @CreateHtmlLocalizer(item.DisplayText.ResourceName).GetString(item.DisplayText.Name) } @if (feature.Description != null) @@ -112,8 +101,8 @@ }
} - +
}
diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs index a96a0c0f88..a9366da30e 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs @@ -69,7 +69,7 @@ public class FeatureManagementModal : AbpPageModel { var features = new UpdateFeaturesDto { - Features = FeatureGroups.SelectMany(g => g.Features).Where(x => !x.Value.IsNullOrWhiteSpace() || x.BoolValue.HasValue).Select(f => new UpdateFeatureDto + Features = FeatureGroups.SelectMany(g => g.Features).Where(x => !x.IsDisabled).Select(f => new UpdateFeatureDto { Name = f.Name, Value = f.Type == nameof(ToggleStringValueType) ? f.BoolValue.ToString() : f.Value @@ -97,11 +97,13 @@ public class FeatureManagementModal : AbpPageModel public class FeatureViewModel { + public bool IsDisabled { get; set; } + public string Name { get; set; } public string Value { get; set; } - public bool? BoolValue { get; set; } + public bool BoolValue { get; set; } public string Type { get; set; } } From 102de58ac3229844f6e967637bb4bbd183cd2e5f Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 12 Apr 2025 17:10:28 +0800 Subject: [PATCH 6/7] Refactor comparison logic in FeatureManager and SettingManager to use string.Equals for fallback value checks --- .../Volo/Abp/FeatureManagement/FeatureManager.cs | 2 +- .../Volo/Abp/SettingManagement/SettingManager.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs index 7227d8d82d..c105779546 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs @@ -152,7 +152,7 @@ public class FeatureManager : IFeatureManager, ISingletonDependency await using (await providers[0].HandleContextAsync(providerName, providerKey)) { var fallbackValue = await GetOrNullInternalAsync(name, providers[1].Name, null); - if (fallbackValue.Value.Equals(value, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(fallbackValue.Value, value, StringComparison.OrdinalIgnoreCase)) { //Clear the value if it's same as it's fallback value value = null; diff --git a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs index f0c9df17fd..b3fd120f38 100644 --- a/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs +++ b/modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs @@ -136,7 +136,7 @@ public class SettingManager : ISettingManager, ISingletonDependency if (providers.Count > 1 && !forceToSet && setting.IsInherited && value != null) { var fallbackValue = await GetOrNullInternalAsync(name, providers[1].Name, null); - if (fallbackValue.Equals(value, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(fallbackValue, value, StringComparison.OrdinalIgnoreCase)) { //Clear the value if it's same as it's fallback value value = null; From 391b16d240db9282de9030ad4f02a13cd419e38a Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 16 Apr 2025 10:59:24 +0800 Subject: [PATCH 7/7] Refactor feature display logic to use GetShownName method for improved clarity and consistency --- .../Components/FeatureManagementModal.razor | 8 ++++---- .../Components/FeatureManagementModal.razor.cs | 11 +++++++++-- .../FeatureManagement/FeatureManagementModal.cshtml | 6 +++--- .../FeatureManagementModal.cshtml.cs | 7 +++++++ 4 files changed, 23 insertions(+), 9 deletions(-) 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 7e00ecf3c3..321a4774b8 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 @@ -35,12 +35,12 @@ {
@{ - var disabled = IsDisabled(feature.Provider.Name); + var disabled = IsDisabled(feature); if (feature.ValueType is FreeTextStringValueType) { - @feature.DisplayName + @GetShownName(feature) @@ -56,7 +56,7 @@ var items = ((SelectionStringValueType)feature.ValueType).ItemSource.Items; var selectedValue = SelectionStringValues[feature.Name]; - @feature.DisplayName + @GetShownName(feature) @foreach (var item in selectType.ItemSource.Items) { diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs index a9366da30e..39bb3ad4f0 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs @@ -90,6 +90,13 @@ public class FeatureManagementModal : AbpPageModel return featureDto.Provider.Name != ProviderName && featureDto.Provider.Name != DefaultValueFeatureValueProvider.ProviderName; } + public string GetShownName(FeatureDto featureDto) + { + return !IsDisabled(featureDto) + ? featureDto.DisplayName + : $"{featureDto.DisplayName} ({featureDto.Provider.Name})"; + } + public class FeatureGroupViewModel { public List Features { get; set; }