Browse Source

Merge branch 'dev' into salihozkara/raffle

pull/18749/head
Salih 3 years ago
parent
commit
65d61d7302
  1. 8
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
  2. 52
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs
  3. 5
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelperService.cs
  4. 19
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs
  5. 42
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-extensions.js
  6. 35
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStep.cs
  7. 1
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs
  8. 5
      framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuExtensions.cs
  9. 41
      modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/Default.cshtml
  10. 45
      modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/_MenuItem.cshtml
  11. 34
      modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs
  12. 2
      npm/publish-mvc.ps1

8
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json

@ -446,7 +446,6 @@
"ExperienceYear": "Years of experience", "ExperienceYear": "Years of experience",
"FullName": "Full name", "FullName": "Full name",
"CompanySize": "Company size", "CompanySize": "Company size",
"Image": "Your profile picture",
"TestimonialTitle": "Let's hear your testimonial", "TestimonialTitle": "Let's hear your testimonial",
"TestimonialInfo": "What our customers say matters! Tell us about your experience with our product and service.", "TestimonialInfo": "What our customers say matters! Tell us about your experience with our product and service.",
"Country": "Country", "Country": "Country",
@ -460,13 +459,14 @@
"SelectCountryPlaceholder": "Your country", "SelectCountryPlaceholder": "Your country",
"YouAreNotAuthorizedToWriteTestimonial": "To be able to write testimonial letter, you must be sign in.", "YouAreNotAuthorizedToWriteTestimonial": "To be able to write testimonial letter, you must be sign in.",
"UnAuthorizeTestimonialInfo": "Your opinion matters! Log in to share it.", "UnAuthorizeTestimonialInfo": "Your opinion matters! Log in to share it.",
"TheFileIsTooLargeForImage": "Your profile picture cannot be more than 1 MB", "TheFileIsTooLargeForImage": "Your profile picture cannot be more than {0} MB",
"ThisExtensionIsNotAllowedForImage": "This extension is not allowed.", "ThisExtensionIsNotAllowedForImage": "This extension is not allowed.",
"FileUploadError": "File upload error", "FileUploadError": "File upload error",
"TestimonialSend": "Thank you! We've received your testimonial. We'll review and take the next step soon.", "TestimonialSend": "Thank you! We've received your testimonial. <br> We'll review and take the next step soon.",
"Title": "Title", "Title": "Title",
"TitlePlaceholder": "Software Developer, CTO etc.", "TitlePlaceholder": "Software Developer, CTO etc.",
"Characters": "characters" "Characters": "characters",
"Testimonial_YourProfilePicture": "Your profile picture (only {0})"
} }
} }

52
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerBaseTagHelperService.cs

@ -68,7 +68,6 @@ public abstract class AbpDatePickerBaseTagHelperService<TTagHelper> : AbpTagHelp
protected readonly IAbpTagHelperLocalizer TagHelperLocalizer; protected readonly IAbpTagHelperLocalizer TagHelperLocalizer;
protected virtual string TagName { get; set; } = "abp-date-picker"; protected virtual string TagName { get; set; } = "abp-date-picker";
protected IStringLocalizer<AbpUiResource> L { get; } protected IStringLocalizer<AbpUiResource> L { get; }
protected InputTagHelper InputTagHelper { get; set; }
protected abstract TagHelperOutput TagHelperOutput { get; set; } protected abstract TagHelperOutput TagHelperOutput { get; set; }
protected AbpDatePickerBaseTagHelperService(IJsonSerializer jsonSerializer, IHtmlGenerator generator, protected AbpDatePickerBaseTagHelperService(IJsonSerializer jsonSerializer, IHtmlGenerator generator,
@ -81,8 +80,6 @@ public abstract class AbpDatePickerBaseTagHelperService<TTagHelper> : AbpTagHelp
ServiceProvider = serviceProvider; ServiceProvider = serviceProvider;
L = l; L = l;
TagHelperLocalizer = tagHelperLocalizer; TagHelperLocalizer = tagHelperLocalizer;
InputTagHelper = new InputTagHelper(Generator) { InputTypeName = "text" };
} }
protected virtual T? GetAttribute<T>() where T : Attribute protected virtual T? GetAttribute<T>() where T : Attribute
@ -95,19 +92,7 @@ public abstract class AbpDatePickerBaseTagHelperService<TTagHelper> : AbpTagHelp
public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{ {
TagHelperOutput = new TagHelperOutput("input", GetInputAttributes(context, output), (_, _) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent())); TagHelperOutput = TagHelperOutput = new TagHelperOutput("input", GetInputAttributes(context, output), (_, _) => Task.FromResult<TagHelperContent>(new DefaultTagHelperContent()));
InputTagHelper.ViewContext = TagHelper.ViewContext;
if (!TagHelper.Name.IsNullOrEmpty())
{
InputTagHelper.Name = TagHelper.Name;
}
if (!TagHelper.Value.IsNullOrEmpty())
{
InputTagHelper.Value = TagHelper.Value;
}
AddDisabledAttribute(TagHelperOutput); AddDisabledAttribute(TagHelperOutput);
AddAutoFocusAttribute(TagHelperOutput); AddAutoFocusAttribute(TagHelperOutput);
@ -131,7 +116,7 @@ public abstract class AbpDatePickerBaseTagHelperService<TTagHelper> : AbpTagHelp
var labelContent = await GetLabelAsHtmlAsync(context, output, TagHelperOutput); var labelContent = await GetLabelAsHtmlAsync(context, output, TagHelperOutput);
var infoContent = GetInfoAsHtml(context, output, TagHelperOutput); var infoContent = GetInfoAsHtml(context, output, TagHelperOutput);
var validationContent = await GetValidationAsHtmlAsync(context, output); var validationContent = await GetValidationAsHtmlAsync(context, TagHelperOutput);
var inputGroup = new TagHelperOutput("div", var inputGroup = new TagHelperOutput("div",
new TagHelperAttributeList(new[] { new TagHelperAttribute("class", "input-group") }), new TagHelperAttributeList(new[] { new TagHelperAttribute("class", "input-group") }),
@ -270,12 +255,12 @@ public abstract class AbpDatePickerBaseTagHelperService<TTagHelper> : AbpTagHelp
if (options.MinDate != null) if (options.MinDate != null)
{ {
attrList.Add("data-min-date", options.MinDate); attrList.Add("data-min-date", options.MinDate?.ToString("O"));
} }
if (options.MaxDate != null) if (options.MaxDate != null)
{ {
attrList.Add("data-max-date", options.MaxDate); attrList.Add("data-max-date", options.MaxDate?.ToString("O"));
} }
if (options.MaxSpan != null) if (options.MaxSpan != null)
@ -754,16 +739,37 @@ public abstract class AbpDatePickerBaseTagHelperService<TTagHelper> : AbpTagHelp
}; };
} }
protected abstract Task<string> GetValidationAsHtmlAsync(TagHelperContext context, TagHelperOutput output); protected virtual Task<string> GetValidationAsHtmlAsync(TagHelperContext context, TagHelperOutput output)
{
var @for = GetModelExpression();
if (@for == null)
{
return Task.FromResult(string.Empty);
}
return GetValidationAsHtmlByInputAsync(context, output, @for);
}
protected virtual async Task<string> GetValidationAsHtmlByInputAsync(TagHelperContext context, protected virtual async Task<string> GetValidationAsHtmlByInputAsync(TagHelperContext context,
TagHelperOutput output, TagHelperOutput output,
[NotNull]InputTagHelper inputTag) [NotNull]ModelExpression @for)
{ {
var validationMessageTagHelper = var validationMessageTagHelper =
new ValidationMessageTagHelper(Generator) { For = inputTag.For, ViewContext = TagHelper.ViewContext }; new ValidationMessageTagHelper(Generator) { For = @for, ViewContext = TagHelper.ViewContext };
var attributeList = new TagHelperAttributeList { { "class", "text-danger col-auto" } }; var attributeList = new TagHelperAttributeList { { "class", "text-danger" } };
if(!output.Attributes.TryGetAttribute("name", out var nameAttribute) || nameAttribute == null || nameAttribute.Value == null)
{
if (nameAttribute != null)
{
output.Attributes.Remove(nameAttribute);
}
nameAttribute = new TagHelperAttribute("name", "date_" + Guid.NewGuid().ToString("N"));
output.Attributes.Add(nameAttribute);
}
attributeList.Add("data-valmsg-for", nameAttribute.Value);
return await validationMessageTagHelper.RenderAsync(attributeList, context, Encoder, "span", return await validationMessageTagHelper.RenderAsync(attributeList, context, Encoder, "span",
TagMode.StartTagAndEndTag); TagMode.StartTagAndEndTag);

5
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDatePickerTagHelperService.cs

@ -77,11 +77,6 @@ public class AbpDatePickerTagHelperService : AbpDatePickerBaseTagHelperService<A
return TagHelper.AspFor; return TagHelper.AspFor;
} }
protected async override Task<string> GetValidationAsHtmlAsync(TagHelperContext context, TagHelperOutput output)
{
return DateTagHelper != null ? await GetValidationAsHtmlByInputAsync(context, output, DateTagHelper) : string.Empty;
}
protected override string GetExtraInputHtml(TagHelperContext context, TagHelperOutput output) protected override string GetExtraInputHtml(TagHelperContext context, TagHelperOutput output)
{ {
return DateTagHelperOutput?.Render(Encoder)!; return DateTagHelperOutput?.Render(Encoder)!;

19
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/DatePicker/AbpDateRangePickerTagHelperService.cs

@ -112,23 +112,6 @@ public class AbpDateRangePickerTagHelperService : AbpDatePickerBaseTagHelperServ
protected override ModelExpression? GetModelExpression() protected override ModelExpression? GetModelExpression()
{ {
return TagHelper.AspForStart; return TagHelper.AspForStart ?? TagHelper.AspForEnd;
}
protected async override Task<string> GetValidationAsHtmlAsync(TagHelperContext context, TagHelperOutput output)
{
var validationHtml = string.Empty;
if (StartDateTagHelper != null)
{
validationHtml += await GetValidationAsHtmlByInputAsync(context, output, StartDateTagHelper);
}
if (EndDateTagHelper != null)
{
validationHtml += await GetValidationAsHtmlByInputAsync(context, output, EndDateTagHelper);
}
return validationHtml;
} }
} }

42
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/date-range-picker/date-range-picker-extensions.js

@ -205,7 +205,7 @@
var today = moment(); var today = moment();
$dateRangePicker.setStartDate(today); $dateRangePicker.setStartDate(today);
$dateRangePicker.setEndDate(today); $dateRangePicker.setEndDate(today);
if(options.singleDatePicker && options.autoApply){ if(options.singleDatePicker && options.autoApply){
$dateRangePicker.clickApply(); $dateRangePicker.clickApply();
}else{ }else{
@ -366,6 +366,14 @@
}); });
} }
if (options.maxDate){
options.maxDate = convertToMoment(options.maxDate, options);
}
if (options.minDate){
options.minDate = convertToMoment(options.minDate, options);
}
if (typeof options.template !== 'string' && !(options.template instanceof $)) if (typeof options.template !== 'string' && !(options.template instanceof $))
options.template = options.template =
'<div class="daterangepicker">' + '<div class="daterangepicker">' +
@ -433,13 +441,13 @@
return ''; return '';
} }
function createInitialAbpDate(date, options) { function createInitialAbpDate(date, options) {
date = convertToMoment(date, options, undefined, options.isUtc); date = convertToMoment(date, options, undefined, options.isUtc);
if (options.isUtc) { if (options.isUtc) {
date = date.local(); date = date.local();
} }
return AbpDate(date, options); return AbpDate(date, options);
} }
@ -468,8 +476,9 @@
var singleOpenAndClearButton = options.singleOpenAndClearButton && $clearButton.length > 0 && $openButton.length > 0; var singleOpenAndClearButton = options.singleOpenAndClearButton && $clearButton.length > 0 && $openButton.length > 0;
var startDate = createInitialAbpDate(options.startDate || options.date || (options.autoUpdateInput ? new Date() : undefined), options); var startDate = createInitialAbpDate(options.startDate || options.date || (options.autoUpdateInput ? new Date() : undefined), options);
var oldStartDate = AbpDate(undefined, options); var oldStartDate = AbpDate(undefined, options);
var endDate = createInitialAbpDate(options.endDate || (options.autoUpdateInput ? new Date() : undefined), options); var endDate = createInitialAbpDate(options.endDate || (options.autoUpdateInput ? new Date() : undefined), options);
var oldEndDate = AbpDate(undefined, options); var oldEndDate = AbpDate(undefined, options);
@ -544,6 +553,10 @@
triggerDateChange($input, startDate, isDateRangePickerTrigger); triggerDateChange($input, startDate, isDateRangePickerTrigger);
} }
} }
if(isTrigger || isInputTrigger || isDateRangePickerTrigger){
triggerValidation();
}
} }
function setDataDates(date, $selfInput, prefix){ function setDataDates(date, $selfInput, prefix){
@ -553,6 +566,25 @@
$input.data(prefix + 'date', date); $input.data(prefix + 'date', date);
} }
function triggerValidation() {
checkValidity($startDateInput);
checkValidity($endDateInput);
checkValidity($dateInput);
checkValidity($input);
}
function checkValidity($selfInput) {
if (!$selfInput) {
return;
}
if($selfInput.closest('form').length === 0) {
return;
}
$selfInput.valid();
}
function triggerDateChange($selfInput, value, isDateRangePickerTrigger) { function triggerDateChange($selfInput, value, isDateRangePickerTrigger) {
$selfInput.trigger('change'); $selfInput.trigger('change');
if(isDateRangePickerTrigger !== false){ if(isDateRangePickerTrigger !== false){
@ -583,7 +615,7 @@
}else{ }else{
picker.setStartDate(convertToMoment(startDate, options, options.inputDateFormat)); picker.setStartDate(convertToMoment(startDate, options, options.inputDateFormat));
} }
if(singleDatePicker){ if(singleDatePicker){
picker.setEndDate(picker.startDate); picker.setEndDate(picker.startDate);
}else if(isEmptyDate(endDate, options)){ }else if(isEmptyDate(endDate, options)){

35
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ChangeThemeStep.cs

@ -372,7 +372,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep
return; return;
} }
lines[lineIndex] = lines[lineIndex].Replace(lines[lineIndex], $"\t<ProjectReference Include=\"{projectReference}\" />"); lines[lineIndex] = lines[lineIndex].Replace(lines[lineIndex], $"\t\t<ProjectReference Include=\"{projectReference}\" />\n");
file.SetLines(lines); file.SetLines(lines);
} }
@ -568,7 +568,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep
private static void ChangeThemeToBasicForMvcProjects(ProjectBuildContext context, string defaultThemeName) private static void ChangeThemeToBasicForMvcProjects(ProjectBuildContext context, string defaultThemeName)
{ {
var projectNames = new[] var projectNames = new[]
{ {
".Web", ".HttpApi.Host", ".AuthServer", ".Web.Public", ".Web.Public.Host", ".Web", ".HttpApi.Host", ".AuthServer", ".Web.Public", ".Web.Public.Host",
"" //for app-nolayers-mvc "" //for app-nolayers-mvc
}; };
@ -608,45 +608,46 @@ public class ChangeThemeStep : ProjectBuildPipelineStep
{ {
var projects = new Dictionary<string, string> var projects = new Dictionary<string, string>
{ {
{"Blazor", "MyProjectNameBlazorModule"}, {".Blazor", "MyProjectNameBlazorModule"},
{"Blazor.Server.Tiered", "MyProjectNameBlazorModule"}, {".Blazor.Server.Tiered", "MyProjectNameBlazorModule"},
{"Blazor.Server", "MyProjectNameModule"}, {".Blazor.Server", "MyProjectNameModule"},
{"Blazor.Server.Mongo", "MyProjectNameModule"} {"Blazor.Server.Mongo", "MyProjectNameModule"},
{"", ""} //for app-nolayers blazor-server
}; };
foreach (var project in projects) foreach (var project in projects)
{ {
ReplacePackageReferenceWithProjectReference( ReplacePackageReferenceWithProjectReference(
context, context,
$"/MyCompanyName.MyProjectName.{project.Key}/MyCompanyName.MyProjectName.{project.Key}.csproj", $"/MyCompanyName.MyProjectName{project.Key}/MyCompanyName.MyProjectName{project.Key}.csproj",
$"Volo.Abp.AspNetCore.Components.Server.{defaultThemeName}Theme", $"Volo.Abp.AspNetCore.Components.Server.{defaultThemeName}",
@"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.Server.BasicTheme\Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj"
); );
ReplacePackageReferenceWithProjectReference( ReplacePackageReferenceWithProjectReference(
context, context,
$"/MyCompanyName.MyProjectName.{project.Key}/MyCompanyName.MyProjectName.{project.Key}.csproj", $"/MyCompanyName.MyProjectName{project.Key}/MyCompanyName.MyProjectName{project.Key}.csproj",
$"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}", $"Volo.Abp.AspNetCore.Mvc.UI.Theme.{defaultThemeName}",
@"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Components.Server.BasicTheme\Volo.Abp.AspNetCore.Components.Server.BasicTheme.csproj" @"..\..\..\..\..\modules\basic-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj"
); );
ReplaceAllKeywords( ReplaceAllKeywords(
context, context,
$"/MyCompanyName.MyProjectName.{project.Key}/Pages/_Host.cshtml", $"/Pages/_Host.cshtml",
$"{defaultThemeName}Theme.Components", $"{defaultThemeName}Theme.Components",
Basic Basic
); );
ReplaceAllKeywords( ReplaceAllKeywords(
context, context,
$"/MyCompanyName.MyProjectName.{project.Key}/{project.Value}.cs", $"/MyCompanyName.MyProjectName{project.Key}/{project.Value}.cs",
defaultThemeName, defaultThemeName,
Basic Basic + "Theme"
); );
ReplaceAllKeywords( ReplaceAllKeywords(
context, context,
$"/MyCompanyName.MyProjectName.{project.Key}/Pages/_Host.cshtml", $"/Pages/_Host.cshtml",
defaultThemeName, defaultThemeName,
Basic Basic
); );
@ -682,7 +683,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep
ReplaceAllKeywords( ReplaceAllKeywords(
context, context,
$"/MyCompanyName.MyProjectName.{projectName}/Pages/_Host.cshtml", $"/Pages/_Host.cshtml",
LeptonX, LeptonX,
Lepton Lepton
); );
@ -731,7 +732,7 @@ public class ChangeThemeStep : ProjectBuildPipelineStep
ReplaceAllKeywords( ReplaceAllKeywords(
context, context,
$"/MyCompanyName.MyProjectName.{projectName}/Pages/_Host.cshtml", $"/Pages/_Host.cshtml",
LeptonX, LeptonX,
Lepton Lepton
); );

1
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs

@ -346,6 +346,7 @@ public abstract class AppNoLayersTemplateBase : TemplateInfo
var blazorServerUiPackageName = isProTemplate ? "@volo/aspnetcore.components.server.leptonxtheme" : "@abp/aspnetcore.components.server.leptonxlitetheme"; var blazorServerUiPackageName = isProTemplate ? "@volo/aspnetcore.components.server.leptonxtheme" : "@abp/aspnetcore.components.server.leptonxlitetheme";
var blazorServerPackageJsonFilePaths = new List<string> var blazorServerPackageJsonFilePaths = new List<string>
{ {
"/MyCompanyName.MyProjectName/package.json",
"/MyCompanyName.MyProjectName.Blazor/package.json", "/MyCompanyName.MyProjectName.Blazor/package.json",
"/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json" "/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json"
}; };

5
framework/src/Volo.Abp.UI.Navigation/Volo/Abp/Ui/Navigation/ApplicationMenuExtensions.cs

@ -115,6 +115,11 @@ public static class ApplicationMenuExtensions
return menuWithGroups; return menuWithGroups;
} }
public static ApplicationMenuItem UseComponent<TComponent>(this ApplicationMenuItem applicationMenuItem)
{
return applicationMenuItem.UseComponent(typeof(TComponent));
}
public static ApplicationMenuItem UseComponent(this ApplicationMenuItem applicationMenuItem, Type componentType) public static ApplicationMenuItem UseComponent(this ApplicationMenuItem applicationMenuItem, Type componentType)
{ {
return applicationMenuItem.WithCustomData(CustomDataComponentKey, componentType); return applicationMenuItem.WithCustomData(CustomDataComponentKey, componentType);

41
modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/Default.cshtml

@ -6,9 +6,15 @@
var cssClass = string.IsNullOrEmpty(menuItem.CssClass) ? string.Empty : menuItem.CssClass; var cssClass = string.IsNullOrEmpty(menuItem.CssClass) ? string.Empty : menuItem.CssClass;
var disabled = menuItem.IsDisabled ? "disabled" : string.Empty; var disabled = menuItem.IsDisabled ? "disabled" : string.Empty;
var url = string.IsNullOrEmpty(menuItem.Url) ? "#" : Url.IsLocalUrl(menuItem.Url) ? Url.Content(menuItem.Url.EnsureStartsWith('~')) : menuItem.Url; var url = string.IsNullOrEmpty(menuItem.Url) ? "#" : Url.IsLocalUrl(menuItem.Url) ? Url.Content(menuItem.Url.EnsureStartsWith('~')) : menuItem.Url;
var customComponentType = menuItem.GetComponentTypeOrDefault();
if (menuItem.IsLeaf) if (menuItem.IsLeaf)
{ {
if (menuItem.Url != null) if (customComponentType != null)
{
@(await Component.InvokeAsync(customComponentType))
}
else if (menuItem.Url != null)
{ {
<li class="nav-item @cssClass @disabled" @elementId> <li class="nav-item @cssClass @disabled" @elementId>
<a class="nav-link" href="@url" target="@menuItem.Target"> <a class="nav-link" href="@url" target="@menuItem.Target">
@ -28,19 +34,26 @@
{ {
<li class="nav-item"> <li class="nav-item">
<div class="dropdown"> <div class="dropdown">
<a class="nav-link dropdown-toggle" href="#" id="Menu_@(menuItem.Name)" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> @if (customComponentType != null)
@if (menuItem.Icon != null) {
{ @(await Component.InvokeAsync(customComponentType))
<i class="@menuItem.Icon"></i> }
} else
@menuItem.DisplayName {
</a> <a class="nav-link dropdown-toggle" href="#" id="Menu_@(menuItem.Name)" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<div class="dropdown-menu border-0 shadow-sm" aria-labelledby="Menu_@(menuItem.Name)"> @if (menuItem.Icon != null)
@foreach (var childMenuItem in menuItem.Items) {
{ <i class="@menuItem.Icon"></i>
@await Html.PartialAsync("~/Themes/Basic/Components/Menu/_MenuItem.cshtml", childMenuItem) }
} @menuItem.DisplayName
</div> </a>
<div class="dropdown-menu border-0 shadow-sm" aria-labelledby="Menu_@(menuItem.Name)">
@foreach (var childMenuItem in menuItem.Items)
{
@await Html.PartialAsync("~/Themes/Basic/Components/Menu/_MenuItem.cshtml", childMenuItem)
}
</div>
}
</div> </div>
</li> </li>
} }

45
modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Components/Menu/_MenuItem.cshtml

@ -5,10 +5,16 @@
var cssClass = string.IsNullOrEmpty(Model.CssClass) ? string.Empty : Model.CssClass; var cssClass = string.IsNullOrEmpty(Model.CssClass) ? string.Empty : Model.CssClass;
var disabled = Model.IsDisabled ? "disabled" : string.Empty; var disabled = Model.IsDisabled ? "disabled" : string.Empty;
var url = string.IsNullOrEmpty(Model.Url) ? "#" : Url.IsLocalUrl(Model.Url) ? Url.Content(Model.Url.EnsureStartsWith('~')) : Model.Url; var url = string.IsNullOrEmpty(Model.Url) ? "#" : Url.IsLocalUrl(Model.Url) ? Url.Content(Model.Url.EnsureStartsWith('~')) : Model.Url;
var customComponentType = Model.GetComponentTypeOrDefault();
} }
@if (Model.IsLeaf) @if (Model.IsLeaf)
{ {
if (Model.Url != null) if (customComponentType != null)
{
@(await Component.InvokeAsync(customComponentType))
}
else if (Model.Url != null)
{ {
<a class="dropdown-item @cssClass @disabled" href="@url" target="@Model.Target" @Html.Raw(elementId)> <a class="dropdown-item @cssClass @disabled" href="@url" target="@Model.Target" @Html.Raw(elementId)>
@if (Model.Icon != null) @if (Model.Icon != null)
@ -25,20 +31,27 @@
else else
{ {
<div class="dropdown-submenu"> <div class="dropdown-submenu">
<a role="button" class="btn dropdown-toggle" data-bs-toggle="dropdown" @if (customComponentType != null)
aria-haspopup="true" aria-expanded="false"> {
<span class="lp-icon"> @(await Component.InvokeAsync(customComponentType))
<i class="@(Model.Icon ?? "")"></i> }
</span> else
<span class="lp-text"> {
@Model.DisplayName <a role="button" class="btn dropdown-toggle" data-bs-toggle="dropdown"
</span> aria-haspopup="true" aria-expanded="false">
</a> <span class="lp-icon">
<div class="dropdown-menu border-0 shadow-sm"> <i class="@(Model.Icon ?? "")"></i>
@foreach (var childMenuItem in Model.Items) </span>
{ <span class="lp-text">
@await Html.PartialAsync("~/Themes/Basic/Components/Menu/_MenuItem.cshtml", childMenuItem) @Model.DisplayName
} </span>
</div> </a>
<div class="dropdown-menu border-0 shadow-sm">
@foreach (var childMenuItem in Model.Items)
{
@await Html.PartialAsync("~/Themes/Basic/Components/Menu/_MenuItem.cshtml", childMenuItem)
}
</div>
}
</div> </div>
} }

34
modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor.cs

@ -17,7 +17,7 @@ public partial class PermissionManagementModal
[Inject] protected ICurrentApplicationConfigurationCacheResetService CurrentApplicationConfigurationCacheResetService { get; set; } [Inject] protected ICurrentApplicationConfigurationCacheResetService CurrentApplicationConfigurationCacheResetService { get; set; }
[Inject] protected IOptions<AbpLocalizationOptions> LocalizationOptions { get; set; } [Inject] protected IOptions<AbpLocalizationOptions> LocalizationOptions { get; set; }
protected Modal _modal; protected Modal _modal;
protected string _providerName; protected string _providerName;
@ -71,7 +71,7 @@ public partial class PermissionManagementModal
} }
} }
} }
protected Dictionary<string, int> _permissionDepths = new Dictionary<string, int>(); protected Dictionary<string, int> _permissionDepths = new Dictionary<string, int>();
public PermissionManagementModal() public PermissionManagementModal()
@ -137,7 +137,7 @@ public partial class PermissionManagementModal
{ {
try try
{ {
var updateDto = new UpdatePermissionsDto var updateDto = new UpdatePermissionsDto
{ {
Permissions = _groups Permissions = _groups
@ -145,7 +145,7 @@ public partial class PermissionManagementModal
.Select(p => new UpdatePermissionDto { IsGranted = p.IsGranted, Name = p.Name }) .Select(p => new UpdatePermissionDto { IsGranted = p.IsGranted, Name = p.Name })
.ToArray() .ToArray()
}; };
if (!updateDto.Permissions.Any(x => x.IsGranted)) if (!updateDto.Permissions.Any(x => x.IsGranted))
{ {
if (!await Message.Confirm(L["SaveWithoutAnyPermissionsWarningMessage"].Value)) if (!await Message.Confirm(L["SaveWithoutAnyPermissionsWarningMessage"].Value))
@ -182,7 +182,7 @@ public partial class PermissionManagementModal
} }
} }
} }
protected virtual int GetPermissionDepthOrDefault(string name) protected virtual int GetPermissionDepthOrDefault(string name)
{ {
return _permissionDepths.GetValueOrDefault(name, 0); return _permissionDepths.GetValueOrDefault(name, 0);
@ -207,7 +207,7 @@ public partial class PermissionManagementModal
{ {
SetParentPermissionGrant(permissionGroup, permission); SetParentPermissionGrant(permissionGroup, permission);
} }
else if (value == false) else
{ {
var childPermissions = GetChildPermissions(permissionGroup, permission); var childPermissions = GetChildPermissions(permissionGroup, permission);
@ -229,7 +229,7 @@ public partial class PermissionManagementModal
SetPermissionGrant(parentPermission, true); SetPermissionGrant(parentPermission, true);
SetParentPermissionGrant(permissionGroup, parentPermission); SetParentPermissionGrant(permissionGroup, parentPermission);
} }
private void SetPermissionGrant(PermissionGrantInfoDto permission, bool value) private void SetPermissionGrant(PermissionGrantInfoDto permission, bool value)
@ -260,7 +260,25 @@ public partial class PermissionManagementModal
protected List<PermissionGrantInfoDto> GetChildPermissions(PermissionGroupDto permissionGroup, PermissionGrantInfoDto permission) protected List<PermissionGrantInfoDto> GetChildPermissions(PermissionGroupDto permissionGroup, PermissionGrantInfoDto permission)
{ {
return permissionGroup.Permissions.Where(x => x.Name.StartsWith(permission.Name)).ToList(); var childPermissions = new List<PermissionGrantInfoDto>();
GetChildPermissions(childPermissions, permissionGroup.Permissions, permission);
return childPermissions;
}
protected void GetChildPermissions(List<PermissionGrantInfoDto> allChildPermissions, List<PermissionGrantInfoDto> permissions, PermissionGrantInfoDto permission)
{
var childPermissions = permissions.Where(x => x.ParentName == permission.Name).ToList();
if (childPermissions.Count == 0)
{
return;
}
allChildPermissions.AddRange(childPermissions);
foreach (var childPermission in childPermissions)
{
GetChildPermissions(allChildPermissions, permissions, childPermission);
}
} }
protected bool IsDisabledPermission(PermissionGrantInfoDto permissionGrantInfo) protected bool IsDisabledPermission(PermissionGrantInfoDto permissionGrantInfo)

2
npm/publish-mvc.ps1

@ -25,7 +25,7 @@ if ($IsPrerelease) {
} }
$commands = ( $commands = (
"npm run lerna -- version $Version --yes --no-commit-hooks --skip-git --force-publish", "npm run lerna -- version $Version --yes --no-commit-hooks --no-git-tag-version --no-push --force-publish",
"yarn replace-with-tilde", "yarn replace-with-tilde",
"cd scripts", "cd scripts",
"yarn install", "yarn install",

Loading…
Cancel
Save