Browse Source

Merge pull request #22628 from abpframework/FeatureManagementModal

Disable features if the value is not from the current provider.
pull/22677/head
Gizem Mutu Kurt 1 year ago
committed by GitHub
parent
commit
3685519561
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 12
      modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor
  2. 11
      modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor.cs
  3. 2
      modules/feature-management/src/Volo.Abp.FeatureManagement.Domain/Volo/Abp/FeatureManagement/FeatureManager.cs
  4. 61
      modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml
  5. 20
      modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml.cs
  6. 1
      modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.css
  7. 2
      modules/setting-management/src/Volo.Abp.SettingManagement.Domain/Volo/Abp/SettingManagement/SettingManager.cs

12
modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor

@ -35,12 +35,12 @@
{
<div class="mt-2">
@{
var disabled = IsDisabled(feature.Provider.Name);
var disabled = IsDisabled(feature);
if (feature.ValueType is FreeTextStringValueType)
{
<Field Style="@GetFeatureStyles(feature)">
<FieldLabel>@feature.DisplayName</FieldLabel>
<FieldLabel>@GetShownName(feature)</FieldLabel>
<TextEdit Disabled="@disabled"
Text="@feature.Value"
TextChanged="@(async (v) => await OnFeatureValueChangedAsync(v, feature))" />
@ -56,8 +56,8 @@
var items = ((SelectionStringValueType)feature.ValueType).ItemSource.Items;
var selectedValue = SelectionStringValues[feature.Name];
<Field Style="@GetFeatureStyles(feature)">
<FieldLabel>@feature.DisplayName</FieldLabel>
<Select TValue="string" SelectedValue="selectedValue" SelectedValueChanged="s => SelectionStringValues[feature.Name] = s">
<FieldLabel>@GetShownName(feature)</FieldLabel>
<Select TValue="string" Disabled="disabled" SelectedValue="selectedValue" SelectedValueChanged="s => SelectionStringValues[feature.Name] = s">
@foreach (var item in items)
{
<SelectItem Value="@item.Value">
@ -75,8 +75,8 @@
if (feature.ValueType is ToggleStringValueType)
{
<Field Style="@GetFeatureStyles(feature)">
<Check TValue="bool" Checked="@ToggleValues[feature.Name]" CheckedChanged="@(async (v) => await OnSelectedValueChangedAsync(v, feature))">
@feature.DisplayName
<Check TValue="bool" Disabled="disabled" Checked="@ToggleValues[feature.Name]" CheckedChanged="@(async (v) => await OnSelectedValueChangedAsync(v, feature))">
@GetShownName(feature)
</Check>
@if (feature.Description != null)
{

11
modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor.cs

@ -150,9 +150,16 @@ public partial class FeatureManagementModal
return $"margin-left: {feature.Depth * 20}px";
}
protected virtual bool IsDisabled(string providerName)
protected virtual bool IsDisabled(FeatureDto feature)
{
return providerName != ProviderName && providerName != DefaultValueFeatureValueProvider.ProviderName;
return feature.Provider.Name != ProviderName && feature.Provider.Name != DefaultValueFeatureValueProvider.ProviderName;
}
public string GetShownName(FeatureDto featureDto)
{
return !IsDisabled(featureDto)
? featureDto.DisplayName
: $"{featureDto.DisplayName} ({featureDto.Provider.Name})";
}
protected virtual async Task OnFeatureValueChangedAsync(string value, FeatureDto feature)

2
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 (string.Equals(fallbackValue.Value, value, StringComparison.OrdinalIgnoreCase))
{
//Clear the value if it's same as it's fallback value
value = null;

61
modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/FeatureManagementModal.cshtml

@ -45,44 +45,40 @@
@for (var j = 0; j < featureGroup.Features.Count; j++)
{
var feature = featureGroup.Features[j];
var disabled = Model.IsDisabled(feature);
<div class="mt-2">
<input type="text" abp-id-name="@Model.FeatureGroups[i].Features[j].IsDisabled" value="@(disabled.ToString())" hidden/>
<input type="text" abp-id-name="@Model.FeatureGroups[i].Features[j].Type" value="@feature.ValueType?.Name" hidden/>
@if (feature.ValueType is ToggleStringValueType)
{
<abp-input asp-for="@feature.Value"
type="checkbox"
class="d-inline"
abp-id-name="@Model.FeatureGroups[i].Features[j].BoolValue"
label="@feature.DisplayName"
group-data-feature-name="@feature.Name"
group-data-parent-name="@(feature.ParentName ?? "")"
group-style="margin-inline-start: @(feature.Depth * 20)px"/>
@if (feature.Description != null)
type="checkbox"
class="d-inline"
abp-id-name="@Model.FeatureGroups[i].Features[j].BoolValue"
label="@Model.GetShownName(feature)"
disabled="disabled"
group-data-feature-name="@feature.Name"
group-data-parent-name="@(feature.ParentName ?? "")"
group-style="margin-inline-start: @(feature.Depth * 20)px"/>
if (feature.Description != null)
{
<div class="form-text" style="margin-inline-start: @(feature.Depth * 20)px">@feature.Description</div>
}
}
@if (feature.ValueType is FreeTextStringValueType)
{
var type = "text";
if(feature.ValueType.Validator is NumericValueValidator)
{
type = "number";
}
var type = feature.ValueType.Validator is NumericValueValidator ? "number" : "text";
<abp-input asp-for="@feature.Value"
label="@feature.DisplayName"
abp-id-name="@Model.FeatureGroups[i].Features[j].Value"
type="@type"
group-data-feature-name="@feature.Name"
group-data-parent-name="@(feature.ParentName ?? "")"
group-style="margin-inline-start: @(feature.Depth * 25)px"/>
@if (feature.Description != null)
label="@Model.GetShownName(feature)"
abp-id-name="@Model.FeatureGroups[i].Features[j].Value"
type="@type"
disabled="disabled"
group-data-feature-name="@feature.Name"
group-data-parent-name="@(feature.ParentName ?? "")"
group-style="margin-inline-start: @(feature.Depth * 25)px"/>
if (feature.Description != null)
{
<div class="form-text" style="margin-inline-start: @(feature.Depth * 25)px">@feature.Description</div>
}
@ -91,19 +87,12 @@
@if (feature.ValueType is SelectionStringValueType selectType)
{
<div data-feature-name="@feature.Name" data-parent-name="@(feature.ParentName ?? "")" style="margin-inline-start: @(feature.Depth * 25)px" class="mb-3">
<label class="form-label" for="@feature.Name">@feature.DisplayName</label>
<select id="@feature.Name" name="FeatureGroups[@i].Features[@j].Value" class="form-select">
<label class="form-label" for="@feature.Name">@Model.GetShownName(feature)</label>
<select id="@feature.Name" name="FeatureGroups[@i].Features[@j].Value" class="form-select" @(disabled ? "disabled" : "")>
@foreach (var item in selectType.ItemSource.Items)
{
if (item.Value == feature.Value)
{
<option value="@item.Value" selected="selected"> @CreateHtmlLocalizer(item.DisplayText.ResourceName).GetString(item.DisplayText.Name) </option>
}
else
{
<option value="@item.Value"> @CreateHtmlLocalizer(item.DisplayText.ResourceName).GetString(item.DisplayText.Name) </option>
}
var selected = item.Value == feature.Value ? "selected=\"selected\"" : "";
<!option value="@item.Value" @(selected) >@CreateHtmlLocalizer(item.DisplayText.ResourceName).GetString(item.DisplayText.Name) </!option>
}
</select>
@if (feature.Description != null)
@ -112,8 +101,8 @@
}
</div>
}
<input value="@feature.Name" abp-id-name="@Model.FeatureGroups[i].Features[j].Name" hidden/>
</div>
}
</div>

20
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]
@ -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.IsDisabled).Select(f => new UpdateFeatureDto
{
Name = f.Name,
Value = f.Type == nameof(ToggleStringValueType) ? f.BoolValue.ToString() : f.Value
@ -85,6 +85,18 @@ public class FeatureManagementModal : AbpPageModel
return NoContent();
}
public bool IsDisabled(FeatureDto featureDto)
{
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<FeatureViewModel> Features { get; set; }
@ -92,6 +104,8 @@ public class FeatureManagementModal : AbpPageModel
public class FeatureViewModel
{
public bool IsDisabled { get; set; }
public string Name { get; set; }
public string Value { get; set; }

1
modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.css

@ -2,7 +2,6 @@
max-height: 400px;
}
.custom-scroll-container > .col-md-4 {
max-height: 500px;
}

2
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 (string.Equals(fallbackValue, value, StringComparison.OrdinalIgnoreCase))
{
//Clear the value if it's same as it's fallback value
value = null;

Loading…
Cancel
Save