From 4852fc9e71723353765338b1ea1ec1875134e3cc Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Thu, 10 Sep 2020 18:00:40 +0800 Subject: [PATCH] Feature Management Modal improvements --- .../Abp/FeatureManagement/FeatureManager.cs | 12 ++- .../FeatureManagementModal.cshtml | 76 ++++++++++++------- .../feature-management-modal.js | 75 ++++++++++++++++-- 3 files changed, 126 insertions(+), 37 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 454ade5476..86a313fb4f 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 @@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Features; +using Volo.Abp.Validation; namespace Volo.Abp.FeatureManagement { @@ -57,7 +58,8 @@ namespace Volo.Abp.FeatureManagement .Select(x => new FeatureNameValue(x.Name, x.Value)).ToList(); } - public async Task GetOrNullWithProviderAsync(string name, string providerName, string providerKey, bool fallback = true) + public async Task GetOrNullWithProviderAsync(string name, + string providerName, string providerKey, bool fallback = true) { Check.NotNull(name, nameof(name)); Check.NotNull(providerName, nameof(providerName)); @@ -65,7 +67,8 @@ namespace Volo.Abp.FeatureManagement return await GetOrNullInternalAsync(name, providerName, providerKey, fallback); } - public async Task> GetAllWithProviderAsync(string providerName, string providerKey, bool fallback = true) + public async Task> GetAllWithProviderAsync(string providerName, + string providerKey, bool fallback = true) { Check.NotNull(providerName, nameof(providerName)); @@ -128,6 +131,11 @@ namespace Volo.Abp.FeatureManagement var feature = FeatureDefinitionManager.Get(name); + if (feature.ValueType.Validator != null && !feature.ValueType.Validator.IsValid(value)) + { + throw new BusinessException($"{feature.Name} value is invalid"); + } + var providers = Enumerable .Reverse(Providers) .SkipWhile(p => p.Name != providerName) 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 601926b193..48143b9a5f 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 @@ -14,55 +14,73 @@ @if (Model.FeatureListResultDto != null && Model.FeatureListResultDto.Groups.Any()) { + var featureGroups = Model.FeatureListResultDto.Groups; + - @for (var i = 0; i < Model.FeatureListResultDto.Groups.Count; i++) + @for (var i = 0; i < featureGroups.Count; i++) { - -

@Model.FeatureListResultDto.Groups[i].DisplayName

+ +

@featureGroups[i].DisplayName


- @for (var j = 0; j < Model.FeatureListResultDto.Groups[i].Features.Count; j++) + @for (var j = 0; j < featureGroups[i].Features.Count; j++) { - var feature = Model.FeatureListResultDto.Groups[i].Features[j]; + var feature = featureGroups[i].Features[j]; var disabled = Model.IsDisabled(feature.Provider.Name); -
- - @feature.DisplayName @(disabled ? $"({feature.Provider.Name})" : "") +
+ + @if (feature.ValueType is ToggleStringValueType) + { + + + } + @if (feature.ValueType is FreeTextStringValueType) { - - + } - @if (feature.ValueType is SelectionStringValueType) + + @if (feature.ValueType is SelectionStringValueType selectType) { - - + @foreach (var item in selectType.ItemSource.Items) { - + if (item.Value == feature.Value) + { + + } + else + { + + } } - } - - } - @if (feature.ValueType is ToggleStringValueType) - { - - + +
} + +
}
diff --git a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js index 7e4960999c..f9ec7e11fa 100644 --- a/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js +++ b/modules/feature-management/src/Volo.Abp.FeatureManagement.Web/Pages/FeatureManagement/feature-management-modal.js @@ -3,12 +3,75 @@ abp.modals = abp.modals || {}; abp.modals.FeatureManagement = function () { - $('.FeatureValueCheckbox').change(function () { - if (this.checked) { - $(this).val('true'); - } else { - $(this).val('false'); + function checkParents($tab, $element, className) { + var parentName = $element + .closest(className) + .attr('data-parent-name'); + + if (!parentName) { + return; + } + + $tab.find('.custom-checkbox') + .filter('[data-feature-name="' + parentName + '"]') + .find('input[type="checkbox"]') + .each(function () { + var $parent = $(this); + $parent.prop('checked', true); + checkParents($tab, $parent, className); + }); + } + + function uncheckChildren($tab, $checkBox) { + var featureName = $checkBox + .closest('.custom-checkbox') + .attr('data-feature-name'); + if (!featureName) { + return; } - }); + + $tab.find('.custom-checkbox') + .filter('[data-parent-name="' + featureName + '"]') + .find('input[type="checkbox"]') + .each(function () { + var $child = $(this); + $child.prop('checked', false); + uncheckChildren($tab, $child); + }); + } + + this.initDom = function ($el) { + $el.find('.tab-pane').each(function () { + var $tab = $(this); + $tab.find('input[type="checkbox"]') + .each(function () { + var $checkBox = $(this); + $checkBox.change(function () { + if ($checkBox.is(':checked')) { + checkParents($tab, $checkBox, '.custom-checkbox') + } else { + uncheckChildren($tab, $checkBox); + } + }); + }); + + $tab.find('.form-control') + .each(function () { + var $element = $(this); + $element.change(function () { + checkParents($tab, $element, '.form-group') + }); + }); + }); + + $(function () { + $('.custom-scroll-content').mCustomScrollbar({ + theme: 'minimal-dark', + }); + $('.custom-scroll-container > .col-4').mCustomScrollbar({ + theme: 'minimal-dark', + }); + }); + }; }; })(jQuery);