Browse Source

Merge pull request #24906 from abpframework/Blazorise2.0

Upgrade to Blazorise 2.0.
pull/24930/head
Enis Necipoglu 1 month ago
committed by GitHub
parent
commit
2bedbc04db
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 8
      Directory.Packages.props
  2. 4
      docs/en/package-version-changes.md
  3. 157
      docs/en/release-info/migration-guides/blazorise-2-0-migration.md
  4. 87
      framework/src/Volo.Abp.BlazoriseUI/BlazoriseFluentSizingParse.cs
  5. 16
      framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs
  6. 41
      framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor
  7. 67
      framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor.cs
  8. 7
      framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.razor.cs
  9. 2
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/CheckExtensionProperty.razor
  10. 6
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeExtensionProperty.razor
  11. 24
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeOffsetExtensionProperty.razor
  12. 29
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeOffsetExtensionProperty.razor.cs
  13. 25
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor
  14. 2
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor
  15. 6
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextAreaExtensionProperty.razor
  16. 4
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextExtensionProperty.razor
  17. 6
      framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor
  18. 4
      framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor
  19. 16
      modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor
  20. 2
      modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Themes/Basic/LoginDisplay.razor
  21. 2
      modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LoginDisplay.razor
  22. 14
      modules/feature-management/src/Volo.Abp.FeatureManagement.Blazor/Components/FeatureManagementModal.razor
  23. 24
      modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor
  24. 70
      modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor
  25. 16
      modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/PermissionManagementModal.razor
  26. 42
      modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/ResourcePermissionManagementModal.razor
  27. 52
      modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor
  28. 2
      modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/TimeZoneSettingGroup/TimeZoneSettingGroupViewComponent.razor
  29. 24
      modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor
  30. 4
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj
  31. 4
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj
  32. 4
      templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj
  33. 4
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/MyCompanyName.MyProjectName.Blazor.Client.csproj
  34. 4
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj
  35. 4
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj
  36. 4
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Client.csproj
  37. 4
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client.csproj
  38. 4
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.csproj
  39. 4
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp/MyCompanyName.MyProjectName.Blazor.WebApp.csproj
  40. 4
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host.Client/MyCompanyName.MyProjectName.Blazor.Host.Client.csproj
  41. 4
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj

8
Directory.Packages.props

@ -19,10 +19,10 @@
<PackageVersion Include="Azure.Identity" Version="1.14.2" /> <PackageVersion Include="Azure.Identity" Version="1.14.2" />
<PackageVersion Include="Azure.Messaging.ServiceBus" Version="7.20.1" /> <PackageVersion Include="Azure.Messaging.ServiceBus" Version="7.20.1" />
<PackageVersion Include="Azure.Storage.Blobs" Version="12.25.0" /> <PackageVersion Include="Azure.Storage.Blobs" Version="12.25.0" />
<PackageVersion Include="Blazorise" Version="1.8.8" /> <PackageVersion Include="Blazorise" Version="2.0.0" />
<PackageVersion Include="Blazorise.Components" Version="1.8.8" /> <PackageVersion Include="Blazorise.Components" Version="2.0.0" />
<PackageVersion Include="Blazorise.DataGrid" Version="1.8.8" /> <PackageVersion Include="Blazorise.DataGrid" Version="2.0.0" />
<PackageVersion Include="Blazorise.Snackbar" Version="1.8.8" /> <PackageVersion Include="Blazorise.Snackbar" Version="2.0.0" />
<PackageVersion Include="Castle.Core" Version="5.2.1" /> <PackageVersion Include="Castle.Core" Version="5.2.1" />
<PackageVersion Include="Castle.Core.AsyncInterceptor" Version="2.1.0" /> <PackageVersion Include="Castle.Core.AsyncInterceptor" Version="2.1.0" />
<PackageVersion Include="CommonMark.NET" Version="0.15.1" /> <PackageVersion Include="CommonMark.NET" Version="0.15.1" />

4
docs/en/package-version-changes.md

@ -4,6 +4,10 @@
| Package | Old Version | New Version | PR | | Package | Old Version | New Version | PR |
|---------|-------------|-------------|-----| |---------|-------------|-------------|-----|
| Blazorise | 1.8.8 | 2.0.0 | #24906 |
| Blazorise.Components | 1.8.8 | 2.0.0 | #24906 |
| Blazorise.DataGrid | 1.8.8 | 2.0.0 | #24906 |
| Blazorise.Snackbar | 1.8.8 | 2.0.0 | #24906 |
| TickerQ | 2.5.3 | 10.1.1 | #24916 | | TickerQ | 2.5.3 | 10.1.1 | #24916 |
| TickerQ.Dashboard | 2.5.3 | 10.1.1 | #24916 | | TickerQ.Dashboard | 2.5.3 | 10.1.1 | #24916 |
| TickerQ.EntityFrameworkCore | 2.5.3 | 10.1.1 | #24916 | | TickerQ.EntityFrameworkCore | 2.5.3 | 10.1.1 | #24916 |

157
docs/en/release-info/migration-guides/blazorise-2-0-migration.md

@ -0,0 +1,157 @@
```json
//[doc-seo]
{
"Description": "This migration guide provides a comprehensive overview of the necessary code changes when upgrading your ABP solution from Blazorise 1.x to 2.0, ensuring a smooth transition to the latest version."
}
```
# ABP Blazorise 1.x to 2.0 Migration Guide
This document summarizes the required code changes when upgrading ABP solutions from Blazorise 1.x to 2.0.
## 1. Package upgrades
Upgrade Blazorise-related packages to `2.0.0`.
- `Blazorise`
- `Blazorise.Components`
- `Blazorise.DataGrid`
- `Blazorise.Snackbar`
- `Blazorise.Bootstrap5`
- `Blazorise.Icons.FontAwesome`
## 2. Input component renames
Blazorise 2.0 uses new input component names:
- `TextEdit` -> `TextInput`
- `MemoEdit` -> `MemoInput`
- `DateEdit` -> `DateInput`
- `TimeEdit` -> `TimeInput`
- `NumericEdit` -> `NumericInput`
- `ColorEdit` -> `ColorInput`
- `FileEdit` -> `FileInput`
## 3. Binding API normalization to Value/ValueChanged
Migrate old binding/value APIs to the new `Value` model.
- `@bind-Text` -> `@bind-Value`
- `Text` / `TextChanged` -> `Value` / `ValueChanged`
- `@bind-Checked` -> `@bind-Value`
- `Checked` / `CheckedChanged` -> `Value` / `ValueChanged`
- `CheckedValue` / `CheckedValueChanged` -> `Value` / `ValueChanged`
- `@bind-Date` / `@bind-Time` -> `@bind-Value`
- `Date` / `DateChanged` -> `Value` / `ValueChanged`
- `Time` / `TimeChanged` -> `Value` / `ValueChanged`
- `@bind-SelectedValue` (for `Select`) -> `@bind-Value`
- `SelectedValue` / `SelectedValueChanged` (for `Select`) -> `Value` / `ValueChanged`
- `@bind-Checked` (for `Switch`) -> `@bind-Value`
- `Checked` / `CheckedChanged` (for `Switch`) -> `Value` / `ValueChanged`
## 4. DatePicker and Select multiple changes
### DatePicker range mode
For `SelectionMode="DateInputSelectionMode.Range"`, the old `Dates` / `DatesChanged` parameters are replaced by the unified `Value` / `ValueChanged`. Use an array or `IReadOnlyList<T>` as `TValue`:
- `@bind-Dates` -> `@bind-Value` (with `TValue="DateTime[]"` or `TValue="IReadOnlyList<DateTime>"`)
- `Dates` / `DatesChanged` -> `Value` / `ValueChanged`
### DatePicker single value mode
For non-range `DatePicker` usage:
- `Date` / `DateChanged` -> `Value` / `ValueChanged`
### Select multiple mode
For `<Select Multiple ...>`, the old `SelectedValues` / `SelectedValuesChanged` parameters are replaced by the unified `Value` / `ValueChanged`. Use an array or `IReadOnlyList<T>` as `TValue`:
- `@bind-SelectedValues` -> `@bind-Value` (with `TValue="string[]"` or `TValue="IReadOnlyList<string>"`)
- `SelectedValues` / `SelectedValuesChanged` -> `Value` / `ValueChanged`
Example:
```razor
<Select TValue="int[]" @bind-Value="Selected" Multiple>
<SelectItem Value="1">One</SelectItem>
<SelectItem Value="2">Two</SelectItem>
</Select>
@code {
private int[] Selected { get; set; } = new int[] { 1 };
}
```
### Empty SelectItem type requirement
For empty placeholder items, set explicit `TValue`:
- `<SelectItem></SelectItem>` -> `<SelectItem TValue="string"></SelectItem>` (or another correct type such as `Guid?`)
## 5. DataGrid migration
### 5.1 Page parameter rename
- `CurrentPage` -> `Page` on `DataGrid`
Important: `AbpExtensibleDataGrid` still uses `CurrentPage` (for example ABP v10.2). Do not rename it to `Page`.
### 5.2 DisplayTemplate context type change
Inside `DisplayTemplate`, use `context.Item` instead of directly using `context`.
Typical updates:
- `context.Property` -> `context.Item.Property`
- `Method(context)` -> `Method(context.Item)`
- `() => Method(context)` -> `() => Method(context.Item)`
- For custom template variable names, same rule applies: `row.Property` -> `row.Item.Property`
The same rule also applies to action handlers in `DataGridEntityActionsColumn` and `DataGridCommandColumn` (such as `Clicked`, `Visible`, and `ConfirmationMessage`):
- `Clicked="async () => await action.Clicked(context)"` -> `Clicked="async () => await action.Clicked(context.Item)"`
- `Visible="action.Visible(context)"` -> `Visible="action.Visible(context.Item)"`
Important: This change applies to DataGrid template contexts only (`DisplayTemplate` in `DataGridColumn`, `DataGridEntityActionsColumn`, etc.). In non-DataGrid templates (for example `TreeView` `NodeContent`), `context` is already the item and should remain unchanged (for example `DeleteMenuItemAsync(context)`).
### 5.3 Width type change (string -> Fluent sizing)
DataGrid column `Width` moved from plain string to fluent sizing APIs:
- `Width="30px"` -> `Width="Width.Px(30)"`
- `Width="60px"` -> `Width="Width.Px(60)"`
- `Width="0.5rem"` -> `Width="Width.Px(8)"` (or another equivalent pixel value)
- `Width="50%"` -> `Width="Width.Percent(50)"` or `Width="Width.Is50"`
- `Width="100%"` -> `Width="Width.Is100"`
For dynamic string widths (for example `column.Width`), ABP introduces `BlazoriseFluentSizingParse.Parse(...)` to convert string values into `IFluentSizingStyle`.
```csharp
Width="@BlazoriseFluentSizingParse.Parse(column.Width)" // column.Width is a string
```
## 6. Modal parameter placement changes
`Size` and `Centered` should be placed on `<Modal>`, not on `<ModalContent>`.
- `<ModalContent Size="..." Centered="true">` -> `<Modal Size="..." Centered="true">` + `<ModalContent>`
## 7. Other component parameter changes
- `Dropdown RightAligned="true"` -> `Dropdown EndAligned="true"`
- `Autocomplete MinLength` -> `MinSearchLength`
## 8. Notes from ABP migration implementation
- Keep component-specific behavior in mind. Not every component follows exactly the same rename pattern.
- `Autocomplete` usage can still involve `SelectedValue` / `SelectedValueChanged`, depending on component API.
- `BarDropdown` and `Dropdown` are different components; align parameter names according to the actual component type.
# Reference
This document may not cover all Blazorise 2.0 changes. For completeness, refer to the official migration guide and release notes:
- [Blazorise 2.0 - Release Notes](https://blazorise.com/news/release-notes/200)
- [Blazorise 2.0 - Migration Guide](https://blazorise.com/news/migration/200)

87
framework/src/Volo.Abp.BlazoriseUI/BlazoriseFluentSizingParse.cs

@ -0,0 +1,87 @@
using Blazorise;
using System;
using System.Globalization;
using System.Text.RegularExpressions;
namespace Volo.Abp.BlazoriseUI;
public static class BlazoriseFluentSizingParse
{
private static readonly Regex SizingPattern = new Regex(
@"^(\d+(?:\.\d+)?)(px|rem|em|ch|vw|vh|%)$",
RegexOptions.IgnoreCase | RegexOptions.Compiled);
/// <summary>
/// Parses a CSS size string into an IFluentSizingStyle.
/// Supported formats (based on Blazorise FluentSizing source):
/// Fixed units : 10px, 10rem, 10em, 10ch
/// Viewport units : 10vw, 10vh
/// Percentage : 25%, 33%, 50%, 66%, 75%, 100% -> maps to SizingSize enum (CSS class)
/// other % values -> inline style
/// Keyword : auto -> SizingSize.Auto
/// CSS variable : var(--my-var), --my-var, or my-var (all handled by WithVariable)
/// </summary>
public static IFluentSizingStyle Parse(string value, SizingType sizingType = SizingType.None)
{
var fluentSizing = new FluentSizing(sizingType);
if (string.IsNullOrWhiteSpace(value))
{
return fluentSizing;
}
value = value.Trim();
// "auto" -> SizingSize.Auto
if (value.Equals("auto", StringComparison.OrdinalIgnoreCase))
{
return (IFluentSizingStyle)fluentSizing.WithSize(SizingSize.Auto);
}
// CSS variable:
// "var(--my-var)" -> used as-is
// "--my-var" -> wrapped as var(--my-var)
// "my-var" -> prepended "--" and wrapped as var(--my-var)
// All three cases are handled correctly by Blazorise's GetCssVariableValue.
if (value.StartsWith("var(", StringComparison.Ordinal) || value.StartsWith("--", StringComparison.Ordinal))
{
return fluentSizing.WithVariable(value);
}
var match = SizingPattern.Match(value);
if (!match.Success)
{
return fluentSizing;
}
var number = double.Parse(match.Groups[1].Value, CultureInfo.InvariantCulture);
var unit = match.Groups[2].Value.ToLowerInvariant();
if (unit == "%")
{
// Standard percentages map to SizingSize enum (generates CSS class via class provider)
var sizingSize = number switch
{
25 => SizingSize.Is25,
33 => SizingSize.Is33,
50 => SizingSize.Is50,
66 => SizingSize.Is66,
75 => SizingSize.Is75,
100 => SizingSize.Is100,
_ => SizingSize.Default
};
if (sizingSize != SizingSize.Default)
{
return (IFluentSizingStyle)fluentSizing.WithSize(sizingSize);
}
// Non-standard percentage falls back to inline style
return fluentSizing.WithSize("%", number);
}
// px, rem, em, ch, vw, vh -> inline style via WithSize(unit, size)
return fluentSizing.WithSize(unit, number);
}
}

16
framework/src/Volo.Abp.BlazoriseUI/BlazoriseUiObjectExtensionPropertyInfoExtensions.cs

@ -211,7 +211,7 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions
{ {
foreach (var attribute in propertyInfo.Attributes) foreach (var attribute in propertyInfo.Attributes)
{ {
var inputTypeByAttribute = GetInputTypeFromAttributeOrNull(attribute); var inputTypeByAttribute = GetInputTypeFromAttributeOrNull(attribute, propertyInfo.Type);
if (inputTypeByAttribute != null) if (inputTypeByAttribute != null)
{ {
return inputTypeByAttribute; return inputTypeByAttribute;
@ -226,7 +226,7 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions
return propertyInfo.Type.IsEnum || TypeHelper.IsNullableEnum(propertyInfo.Type); return propertyInfo.Type.IsEnum || TypeHelper.IsNullableEnum(propertyInfo.Type);
} }
private static Type? GetInputTypeFromAttributeOrNull(Attribute attribute) private static Type? GetInputTypeFromAttributeOrNull(Attribute attribute, Type propertyType)
{ {
var hasTextEditSupport = TextEditSupportedAttributeTypes.Any(t => t == attribute.GetType()); var hasTextEditSupport = TextEditSupportedAttributeTypes.Any(t => t == attribute.GetType());
@ -235,7 +235,6 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions
return typeof(TextExtensionProperty<,>); return typeof(TextExtensionProperty<,>);
} }
if (attribute is DataTypeAttribute dataTypeAttribute) if (attribute is DataTypeAttribute dataTypeAttribute)
{ {
switch (dataTypeAttribute.DataType) switch (dataTypeAttribute.DataType)
@ -247,7 +246,9 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions
return typeof(TextExtensionProperty<,>); return typeof(TextExtensionProperty<,>);
case DataType.Date: case DataType.Date:
case DataType.DateTime: case DataType.DateTime:
return typeof(DateTimeExtensionProperty<,>); return propertyType == typeof(DateTimeOffset) || propertyType == typeof(DateTimeOffset?)
? typeof(DateTimeOffsetExtensionProperty<,>)
: typeof(DateTimeExtensionProperty<,>);
case DataType.Time: case DataType.Time:
return typeof(TimeExtensionProperty<,>); return typeof(TimeExtensionProperty<,>);
case DataType.MultilineText: case DataType.MultilineText:
@ -265,11 +266,16 @@ public static class BlazoriseUiObjectExtensionPropertyInfoExtensions
return typeof(CheckExtensionProperty<,>); return typeof(CheckExtensionProperty<,>);
} }
if (type == typeof(DateTime)) if (type == typeof(DateTime) || type == typeof(DateTime?))
{ {
return typeof(DateTimeExtensionProperty<,>); return typeof(DateTimeExtensionProperty<,>);
} }
if (type == typeof(DateTimeOffset) || type == typeof(DateTimeOffset?))
{
return typeof(DateTimeOffsetExtensionProperty<,>);
}
if (NumberTypes.Contains(type)) if (NumberTypes.Contains(type))
{ {
return typeof(TextExtensionProperty<,>); return typeof(TextExtensionProperty<,>);

41
framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor

@ -7,7 +7,7 @@
ReadData="@ReadData" ReadData="@ReadData"
TotalItems="@TotalItems" TotalItems="@TotalItems"
ShowPager="@ShowPager" ShowPager="@ShowPager"
CurrentPage="@CurrentPage" Page="@CurrentPage"
PageSize="@PageSize" PageSize="@PageSize"
Responsive="@Responsive" Responsive="@Responsive"
Striped Striped
@ -44,9 +44,9 @@
<EntityAction TItem="TItem" <EntityAction TItem="TItem"
Color="@(action.Color != null ? (Blazorise.Color)action.Color : Blazorise.Color.Primary)" Color="@(action.Color != null ? (Blazorise.Color)action.Color : Blazorise.Color.Primary)"
Icon="@action.Icon" Icon="@action.Icon"
Clicked="async () => await action.Clicked(context!)" Clicked="async () => await action.Clicked(context.Item!)"
ConfirmationMessage="() => action.ConfirmationMessage.Invoke(context!)" ConfirmationMessage="() => action.ConfirmationMessage.Invoke(context.Item!)"
Visible="@(action.Visible != null ? action.Visible(context!) : true)" Visible="@(action.Visible != null ? action.Visible(context.Item!) : true)"
Text="@action.Text" Text="@action.Text"
Disabled="@action.Disabled"> Disabled="@action.Disabled">
</EntityAction> </EntityAction>
@ -54,10 +54,10 @@
else else
{ {
<EntityAction TItem="TItem" <EntityAction TItem="TItem"
Clicked="async () => await action.Clicked(context!)" Clicked="async () => await action.Clicked(context.Item!)"
Color="@(action.Color != null ? (Blazorise.Color)action.Color : Blazorise.Color.Primary)" Color="@(action.Color != null ? (Blazorise.Color)action.Color : Blazorise.Color.Primary)"
Icon="@action.Icon" Icon="@action.Icon"
Visible="@(action.Visible != null ? action.Visible(context!) : true)" Visible="@(action.Visible != null ? action.Visible(context.Item!) : true)"
Text="@action.Text" Text="@action.Text"
Disabled="@action.Disabled"> Disabled="@action.Disabled">
</EntityAction> </EntityAction>
@ -73,17 +73,17 @@
{ {
@if (column.ValueConverter == null) @if (column.ValueConverter == null)
{ {
<DataGridColumn TItem="TItem" Field="@column.Data" Width="@column.Width" Caption="@column.Title" Sortable="@column.Sortable" DisplayFormat="@column.DisplayFormat" DisplayFormatProvider="@column.DisplayFormatProvider" Displayable="column.Visible" > <DataGridColumn TItem="TItem" Field="@column.Data" Width="@BlazoriseFluentSizingParse.Parse(column.Width, SizingType.Width)" Caption="@column.Title" Sortable="@column.Sortable" DisplayFormat="@column.DisplayFormat" DisplayFormatProvider="@column.DisplayFormatProvider" Displayable="column.Visible" >
<DisplayTemplate> <DisplayTemplate>
@RenderCustomTableColumnComponent(column.Component, context!) @RenderCustomTableColumnComponent(column.Component, context.Item!)
</DisplayTemplate> </DisplayTemplate>
</DataGridColumn> </DataGridColumn>
} }
else else
{ {
<DataGridColumn TItem="TItem" Field="@column.Data" Width="@column.Width" Caption="@column.Title" Sortable="@column.Sortable" Displayable="column.Visible"> <DataGridColumn TItem="TItem" Field="@column.Data" Width="@BlazoriseFluentSizingParse.Parse(column.Width, SizingType.Width)" Caption="@column.Title" Sortable="@column.Sortable" Displayable="column.Visible">
<DisplayTemplate> <DisplayTemplate>
@RenderCustomTableColumnComponent(column.Component, context!) @RenderCustomTableColumnComponent(column.Component, context.Item!)
</DisplayTemplate> </DisplayTemplate>
</DataGridColumn> </DataGridColumn>
} }
@ -92,11 +92,11 @@
{ {
if (!ExtensionPropertiesRegex.IsMatch(column.Data)) if (!ExtensionPropertiesRegex.IsMatch(column.Data))
{ {
@if (column.ValueConverter == null) @if (column.ValueConverter == null && !IsDateTimeColumn(column))
{ {
<DataGridColumn TItem="TItem" <DataGridColumn TItem="TItem"
Field="@column.Data" Field="@column.Data"
Width="@column.Width" Width="@BlazoriseFluentSizingParse.Parse(column.Width, SizingType.Width)"
Caption="@column.Title" Caption="@column.Title"
Sortable="@column.Sortable" Sortable="@column.Sortable"
DisplayFormat="@column.DisplayFormat" DisplayFormat="@column.DisplayFormat"
@ -107,19 +107,19 @@
{ {
<DataGridColumn TItem="TItem" <DataGridColumn TItem="TItem"
Field="@column.Data" Field="@column.Data"
Width="@column.Width" Width="@BlazoriseFluentSizingParse.Parse(column.Width, SizingType.Width)"
Caption="@column.Title" Caption="@column.Title"
Sortable="@column.Sortable" Sortable="@column.Sortable"
Displayable="column.Visible"> Displayable="column.Visible">
<DisplayTemplate> <DisplayTemplate>
@((MarkupString)GetConvertedFieldValue(context, column)) @((MarkupString)GetConvertedFieldValue(context.Item, column))
</DisplayTemplate> </DisplayTemplate>
</DataGridColumn> </DataGridColumn>
} }
} }
else else
{ {
<DataGridColumn TItem="TItem" Field="@nameof(IHasExtraProperties.ExtraProperties)" SortField="@column.PropertyName" Width="@column.Width" Caption="@column.Title" Displayable="column.Visible" Sortable="@column.Sortable"> <DataGridColumn TItem="TItem" Field="@nameof(IHasExtraProperties.ExtraProperties)" SortField="@column.PropertyName" Width="@BlazoriseFluentSizingParse.Parse(column.Width, SizingType.Width)" Caption="@column.Title" Displayable="column.Visible" Sortable="@column.Sortable">
<DisplayTemplate> <DisplayTemplate>
@{ @{
var entity = context as IHasExtraProperties; var entity = context as IHasExtraProperties;
@ -140,18 +140,11 @@
{ {
if (column.ValueConverter != null) if (column.ValueConverter != null)
{ {
@((MarkupString)GetConvertedFieldValue(context, column)) @((MarkupString)GetConvertedFieldValue(context.Item, column))
} }
else else
{ {
if (column.DisplayFormat == null) @((MarkupString)GetConvertedFieldValue(propertyValue, column))
{
@(propertyValue)
}
else
{
@(string.Format(column.DisplayFormatProvider, column.DisplayFormat, propertyValue))
}
} }
} }
} }

67
framework/src/Volo.Abp.BlazoriseUI/Components/AbpExtensibleDataGrid.razor.cs

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Blazorise.DataGrid; using Blazorise.DataGrid;
using Blazorise.Extensions; using Blazorise.Extensions;
@ -7,6 +8,7 @@ using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using Volo.Abp.AspNetCore.Components.Web.Extensibility.TableColumns; using Volo.Abp.AspNetCore.Components.Web.Extensibility.TableColumns;
using Volo.Abp.Timing;
namespace Volo.Abp.BlazoriseUI.Components; namespace Volo.Abp.BlazoriseUI.Components;
@ -45,6 +47,9 @@ public partial class AbpExtensibleDataGrid<TItem> : ComponentBase
[Inject] [Inject]
public IStringLocalizer<AbpUiResource> UiLocalizer { get; set; } = default!; public IStringLocalizer<AbpUiResource> UiLocalizer { get; set; } = default!;
[Inject]
public IClock Clock { get; set; } = default!;
protected virtual RenderFragment RenderCustomTableColumnComponent(Type type, object data) protected virtual RenderFragment RenderCustomTableColumnComponent(Type type, object data)
{ {
return (builder) => return (builder) =>
@ -57,13 +62,67 @@ public partial class AbpExtensibleDataGrid<TItem> : ComponentBase
protected virtual string GetConvertedFieldValue(TItem item, TableColumn columnDefinition) protected virtual string GetConvertedFieldValue(TItem item, TableColumn columnDefinition)
{ {
var convertedValue = columnDefinition.ValueConverter!.Invoke(item!); if (columnDefinition.ValueConverter != null)
{
var convertedValue = columnDefinition.ValueConverter.Invoke(item!);
if (!columnDefinition.DisplayFormat.IsNullOrEmpty())
{
return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, convertedValue);
}
return convertedValue;
}
var propertyInfo = item!.GetType().GetProperty(columnDefinition.Data);
return GetConvertedFieldValue(propertyInfo?.GetValue(item), columnDefinition);
}
protected virtual string GetConvertedFieldValue(object? value, TableColumn columnDefinition)
{
if (value is DateTime dateTime)
{
var converted = Clock.ConvertToUserTime(dateTime);
if (!columnDefinition.DisplayFormat.IsNullOrEmpty())
{
return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, converted);
}
return converted.ToString(columnDefinition.DisplayFormatProvider as CultureInfo ?? CultureInfo.CurrentCulture);
}
if (value is DateTimeOffset dateTimeOffset)
{
var converted = Clock.ConvertToUserTime(dateTimeOffset);
if (!columnDefinition.DisplayFormat.IsNullOrEmpty())
{
return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, converted);
}
return converted.ToString(columnDefinition.DisplayFormatProvider as CultureInfo ?? CultureInfo.CurrentCulture);
}
if (value == null)
{
return string.Empty;
}
if (!columnDefinition.DisplayFormat.IsNullOrEmpty()) if (!columnDefinition.DisplayFormat.IsNullOrEmpty())
{ {
return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, return string.Format(columnDefinition.DisplayFormatProvider, columnDefinition.DisplayFormat!, value);
convertedValue); }
return value.ToString() ?? string.Empty;
}
protected virtual bool IsDateTimeColumn(TableColumn columnDefinition)
{
var propertyInfo = typeof(TItem).GetProperty(columnDefinition.Data);
if (propertyInfo == null)
{
return false;
} }
return convertedValue; var propertyType = Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType;
return propertyType == typeof(DateTime) || propertyType == typeof(DateTimeOffset);
} }
} }

7
framework/src/Volo.Abp.BlazoriseUI/Components/DataGridEntityActionsColumn.razor.cs

@ -1,5 +1,6 @@
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Blazorise;
using Blazorise.DataGrid; using Blazorise.DataGrid;
using Localization.Resources.AbpUi; using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
@ -21,13 +22,13 @@ public partial class DataGridEntityActionsColumn<TItem> : DataGridColumn<TItem>
protected virtual ValueTask SetDefaultValuesAsync() protected virtual ValueTask SetDefaultValuesAsync()
{ {
Caption = UiLocalizer["Actions"]; Caption = UiLocalizer["Actions"];
Width = "150px"; Width = Blazorise.Width.Px(150);
Sortable = false; Sortable = false;
Field = ResolveFieldName(); Field = ResolveFieldName();
return ValueTask.CompletedTask; return ValueTask.CompletedTask;
} }
protected virtual string ResolveFieldName() protected virtual string ResolveFieldName()
{ {
var props = typeof(TItem).GetProperties(); var props = typeof(TItem).GetProperties();

2
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/CheckExtensionProperty.razor

@ -7,7 +7,7 @@
{ {
<Validation Validator="@Validate" MessageLocalizer="@LH.Localize"> <Validation Validator="@Validate" MessageLocalizer="@LH.Localize">
<Field> <Field>
<Check TValue="bool" @bind-Checked="@Value" Disabled="IsReadonlyField"> <Check TValue="bool" @bind-Value="@Value" Disabled="IsReadonlyField">
<ChildContent> <ChildContent>
@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory) @PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)
</ChildContent> </ChildContent>

6
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeExtensionProperty.razor

@ -10,15 +10,15 @@
<Validation Validator="@Validate" MessageLocalizer="@LH.Localize"> <Validation Validator="@Validate" MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel> <FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel>
<DateEdit TValue="DateTime?" <DateInput TValue="DateTime?"
InputMode="@(PropertyInfo.IsDate() ? DateInputMode.Date : DateInputMode.DateTime)" InputMode="@(PropertyInfo.IsDate() ? DateInputMode.Date : DateInputMode.DateTime)"
Pattern="@PropertyInfo.GetDateEditInputFormatOrNull()" Pattern="@PropertyInfo.GetDateEditInputFormatOrNull()"
Disabled="IsReadonlyField" Disabled="IsReadonlyField"
@bind-Date="@Value"> @bind-Value="@Value">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</DateEdit> </DateInput>
</Field> </Field>
</Validation> </Validation>
} }

24
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeOffsetExtensionProperty.razor

@ -0,0 +1,24 @@
@typeparam TEntity
@typeparam TResourceType
@using Volo.Abp.BlazoriseUI
@using Volo.Abp.Localization
@using Volo.Abp.ObjectExtending
@inherits ExtensionPropertyComponentBase<TEntity, TResourceType>
@if (PropertyInfo != null && Entity != null)
{
<Validation Validator="@Validate" MessageLocalizer="@LH.Localize">
<Field>
<FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel>
<DateInput TValue="DateTimeOffset?"
InputMode="@(PropertyInfo.IsDate() ? DateInputMode.Date : DateInputMode.DateTime)"
Pattern="@PropertyInfo.GetDateEditInputFormatOrNull()"
Disabled="IsReadonlyField"
@bind-Value="@Value">
<Feedback>
<ValidationError/>
</Feedback>
</DateInput>
</Field>
</Validation>
}

29
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/DateTimeOffsetExtensionProperty.razor.cs

@ -0,0 +1,29 @@
using System;
using Volo.Abp.Data;
namespace Volo.Abp.BlazoriseUI.Components.ObjectExtending;
public partial class DateTimeOffsetExtensionProperty<TEntity, TResourceType>
where TEntity : IHasExtraProperties
{
protected DateTimeOffset? Value {
get {
var raw = Entity.GetProperty(PropertyInfo.Name);
return raw switch
{
null => null,
DateTimeOffset dto => dto,
DateTime dt => dt.Kind switch
{
DateTimeKind.Utc => new DateTimeOffset(dt, TimeSpan.Zero),
DateTimeKind.Local => new DateTimeOffset(dt),
_ => new DateTimeOffset(DateTime.SpecifyKind(dt, DateTimeKind.Utc), TimeSpan.Zero)
},
_ => null
};
}
set {
Entity.SetProperty(PropertyInfo.Name, value, false);
}
}
}

25
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/LookupExtensionProperty.razor

@ -6,16 +6,17 @@
<Field> <Field>
<FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel> <FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel>
<Autocomplete Data="@lookupItems" <Validation Validator="@Validate">
TItem="SelectItem<object>" <Autocomplete Data="@lookupItems"
TValue="object" TItem="SelectItem<object>"
TextField="item => item?.Text!" TValue="object"
ValueField="item => item?.Value!" TextField="item => item?.Text!"
SelectedValue="@SelectedValue" ValueField="item => item?.Value!"
SelectedValueChanged="@SelectedValueChanged" SelectedValue="@SelectedValue"
SearchChanged="@SearchFilterChangedAsync" SelectedValueChanged="@SelectedValueChanged"
Validator="@Validate" SearchChanged="@SearchFilterChangedAsync"
MinLength="0" MinSearchLength="0"
Disabled="IsReadonlyField"> Disabled="IsReadonlyField">
</Autocomplete> </Autocomplete>
</Validation>
</Field> </Field>

2
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/SelectExtensionProperty.razor

@ -6,7 +6,7 @@
<Validation Validator="@Validate" MessageLocalizer="@LH.Localize"> <Validation Validator="@Validate" MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel> <FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel>
<Select @bind-SelectedValue="@SelectedValue"> <Select @bind-Value="@SelectedValue">
<ChildContent> <ChildContent>
@foreach (var item in SelectItems) @foreach (var item in SelectItems)
{ {

6
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextAreaExtensionProperty.razor

@ -1,4 +1,4 @@
@typeparam TEntity @typeparam TEntity
@typeparam TResourceType @typeparam TResourceType
@using Volo.Abp.BlazoriseUI @using Volo.Abp.BlazoriseUI
@using Volo.Abp.Localization @using Volo.Abp.Localization
@ -9,11 +9,11 @@
<Validation Validator="@Validate" MessageLocalizer="@LH.Localize"> <Validation Validator="@Validate" MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel> <FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel>
<MemoEdit @bind-Text="@Value" AutoSize Disabled="IsReadonlyField"> <MemoInput @bind-Value="@Value" AutoSize Disabled="IsReadonlyField">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</MemoEdit> </MemoInput>
</Field> </Field>
</Validation> </Validation>
} }

4
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TextExtensionProperty.razor

@ -9,11 +9,11 @@
<Validation Validator="@Validate" MessageLocalizer="@LH.Localize"> <Validation Validator="@Validate" MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel> <FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel>
<TextEdit @bind-Text="@Value" Role="@PropertyInfo.GetTextRole()" InputMode="@PropertyInfo.GetTextInputMode()" Disabled="IsReadonlyField"> <TextInput @bind-Value="@Value" Role="@PropertyInfo.GetTextRole()" InputMode="@PropertyInfo.GetTextInputMode()" Disabled="IsReadonlyField">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
} }

6
framework/src/Volo.Abp.BlazoriseUI/Components/ObjectExtending/TimeExtensionProperty.razor

@ -7,12 +7,12 @@
{ {
<Validation Validator="@Validate" MessageLocalizer="@LH.Localize"> <Validation Validator="@Validate" MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel>--> <FieldLabel>@PropertyInfo.GetLocalizedDisplayName(StringLocalizerFactory)</FieldLabel>
<TimeEdit TValue="TimeSpan?" @bind-Time="@Value" Disabled="IsReadonlyField"> <TimeInput TValue="TimeSpan?" @bind-Value="@Value" Disabled="IsReadonlyField">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TimeEdit> </TimeInput>
</Field> </Field>
</Validation> </Validation>
} }

4
framework/src/Volo.Abp.BlazoriseUI/Components/UiMessageAlert.razor

@ -1,5 +1,5 @@
<Modal @ref="@ModalRef" Closing="@OnModalClosing"> <Modal @ref="@ModalRef" Closing="@OnModalClosing" Centered="@CenterMessage">
<ModalContent Centered="@CenterMessage"> <ModalContent>
@if (!Title.IsNullOrEmpty()) @if (!Title.IsNullOrEmpty())
{ {
<ModalHeader> <ModalHeader>

16
modules/account/src/Volo.Abp.Account.Blazor/Pages/Account/AccountManage.razor

@ -23,15 +23,15 @@
<EditForm id="ChangePasswordForm" Model="@ChangePasswordModel" OnValidSubmit="ChangePasswordAsync"> <EditForm id="ChangePasswordForm" Model="@ChangePasswordModel" OnValidSubmit="ChangePasswordAsync">
<Field> <Field>
<FieldLabel>@L["DisplayName:CurrentPassword"]</FieldLabel> <FieldLabel>@L["DisplayName:CurrentPassword"]</FieldLabel>
<TextEdit Role="@TextRole.Password" @bind-Text="@ChangePasswordModel.CurrentPassword" /> <TextInput Role="@TextRole.Password" @bind-Value="@ChangePasswordModel.CurrentPassword" />
</Field> </Field>
<Field> <Field>
<FieldLabel>@L["DisplayName:NewPassword"]</FieldLabel> <FieldLabel>@L["DisplayName:NewPassword"]</FieldLabel>
<TextEdit Role="@TextRole.Password" @bind-Text="@ChangePasswordModel.NewPassword" /> <TextInput Role="@TextRole.Password" @bind-Value="@ChangePasswordModel.NewPassword" />
</Field> </Field>
<Field> <Field>
<FieldLabel>@L["DisplayName:NewPasswordConfirm"]</FieldLabel> <FieldLabel>@L["DisplayName:NewPasswordConfirm"]</FieldLabel>
<TextEdit Role="@TextRole.Password" @bind-Text="@ChangePasswordModel.NewPasswordConfirm" /> <TextInput Role="@TextRole.Password" @bind-Value="@ChangePasswordModel.NewPasswordConfirm" />
</Field> </Field>
<Field> <Field>
<SubmitButton Form="ChangePasswordForm" Clicked="@ChangePasswordAsync" /> <SubmitButton Form="ChangePasswordForm" Clicked="@ChangePasswordAsync" />
@ -45,25 +45,25 @@
<EditForm id="UpdatePersonalInfoForm" Model="@PersonalInfoModel" OnValidSubmit="UpdatePersonalInfoAsync"> <EditForm id="UpdatePersonalInfoForm" Model="@PersonalInfoModel" OnValidSubmit="UpdatePersonalInfoAsync">
<Field> <Field>
<FieldLabel>@L["DisplayName:UserName"]</FieldLabel> <FieldLabel>@L["DisplayName:UserName"]</FieldLabel>
<TextEdit @bind-Text="@PersonalInfoModel.UserName" /> <TextInput @bind-Value="@PersonalInfoModel.UserName" />
</Field> </Field>
<Fields> <Fields>
<Field ColumnSize="ColumnSize.Is6"> <Field ColumnSize="ColumnSize.Is6">
<FieldLabel>@L["DisplayName:Name"]</FieldLabel> <FieldLabel>@L["DisplayName:Name"]</FieldLabel>
<TextEdit @bind-Text="@PersonalInfoModel.Name" /> <TextInput @bind-Value="@PersonalInfoModel.Name" />
</Field> </Field>
<Field ColumnSize="ColumnSize.Is6"> <Field ColumnSize="ColumnSize.Is6">
<FieldLabel>@L["DisplayName:Surname"]</FieldLabel> <FieldLabel>@L["DisplayName:Surname"]</FieldLabel>
<TextEdit @bind-Text="@PersonalInfoModel.Surname" /> <TextInput @bind-Value="@PersonalInfoModel.Surname" />
</Field> </Field>
</Fields> </Fields>
<Field> <Field>
<FieldLabel>@L["DisplayName:Email"]</FieldLabel> <FieldLabel>@L["DisplayName:Email"]</FieldLabel>
<TextEdit @bind-Text="@PersonalInfoModel.Email" /> <TextInput @bind-Value="@PersonalInfoModel.Email" />
</Field> </Field>
<Field> <Field>
<FieldLabel>@L["DisplayName:PhoneNumber"]</FieldLabel> <FieldLabel>@L["DisplayName:PhoneNumber"]</FieldLabel>
<TextEdit @bind-Text="@PersonalInfoModel.PhoneNumber" /> <TextInput @bind-Value="@PersonalInfoModel.PhoneNumber" />
</Field> </Field>
// TODO: Move this logic to 'ExtensionProperties' component. // TODO: Move this logic to 'ExtensionProperties' component.

2
modules/basic-theme/src/Volo.Abp.AspNetCore.Components.Server.BasicTheme/Themes/Basic/LoginDisplay.razor

@ -10,7 +10,7 @@
@inject IStringLocalizer<AbpUiResource> L @inject IStringLocalizer<AbpUiResource> L
<AuthorizeView> <AuthorizeView>
<Authorized> <Authorized>
<Dropdown RightAligned="true"> <Dropdown EndAligned="true">
<DropdownToggle Color="Color.Default"> <DropdownToggle Color="Color.Default">
@if (CurrentTenant.Name != null) @if (CurrentTenant.Name != null)
{ {

2
modules/basic-theme/src/Volo.Abp.AspNetCore.Components.WebAssembly.BasicTheme/Themes/Basic/LoginDisplay.razor

@ -10,7 +10,7 @@
@inject IOptions<AbpAspNetCoreComponentsWebOptions> AbpAspNetCoreComponentsWebOptions @inject IOptions<AbpAspNetCoreComponentsWebOptions> AbpAspNetCoreComponentsWebOptions
<AuthorizeView> <AuthorizeView>
<Authorized> <Authorized>
<Dropdown RightAligned="true"> <Dropdown EndAligned="true">
<DropdownToggle Color="Color.Default"> <DropdownToggle Color="Color.Default">
@if (CurrentTenant.Name != null) @if (CurrentTenant.Name != null)
{ {

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

@ -2,8 +2,8 @@
@using Microsoft.Extensions.Localization @using Microsoft.Extensions.Localization
@inherits AbpFeatureManagementComponentBase @inherits AbpFeatureManagementComponentBase
<Modal @ref="Modal" Closing="@ClosingModal"> <Modal @ref="Modal" Closing="@ClosingModal" Size="ModalSize.Large">
<ModalContent Size="ModalSize.Large"> <ModalContent>
<ModalHeader> <ModalHeader>
<ModalTitle>@L["Features"]@ProviderKeyDisplayName</ModalTitle> <ModalTitle>@L["Features"]@ProviderKeyDisplayName</ModalTitle>
<CloseButton Clicked="CloseModal" /> <CloseButton Clicked="CloseModal" />
@ -41,9 +41,9 @@
{ {
<Field Style="@GetFeatureStyles(feature)"> <Field Style="@GetFeatureStyles(feature)">
<FieldLabel>@GetShownName(feature)</FieldLabel> <FieldLabel>@GetShownName(feature)</FieldLabel>
<TextEdit Disabled="@disabled" <TextInput Disabled="@disabled"
Text="@feature.Value" Value="@feature.Value"
TextChanged="@(async (v) => await OnFeatureValueChangedAsync(v, feature))" /> ValueChanged="@(async (v) => await OnFeatureValueChangedAsync(v, feature))" />
@if (feature.Description != null) @if (feature.Description != null)
{ {
<div class="form-text">@feature.Description</div> <div class="form-text">@feature.Description</div>
@ -57,7 +57,7 @@
var selectedValue = SelectionStringValues[feature.Name]; var selectedValue = SelectionStringValues[feature.Name];
<Field Style="@GetFeatureStyles(feature)"> <Field Style="@GetFeatureStyles(feature)">
<FieldLabel>@GetShownName(feature)</FieldLabel> <FieldLabel>@GetShownName(feature)</FieldLabel>
<Select TValue="string" Disabled="disabled" SelectedValue="selectedValue" SelectedValueChanged="s => SelectionStringValues[feature.Name] = s"> <Select TValue="string" Disabled="disabled" Value="selectedValue" ValueChanged="s => SelectionStringValues[feature.Name] = s">
@foreach (var item in items) @foreach (var item in items)
{ {
<SelectItem Value="@item.Value"> <SelectItem Value="@item.Value">
@ -75,7 +75,7 @@
if (feature.ValueType is ToggleStringValueType) if (feature.ValueType is ToggleStringValueType)
{ {
<Field Style="@GetFeatureStyles(feature)"> <Field Style="@GetFeatureStyles(feature)">
<Check TValue="bool" Disabled="disabled" Checked="@ToggleValues[feature.Name]" CheckedChanged="@(async (v) => await OnSelectedValueChangedAsync(v, feature))"> <Check TValue="bool" Disabled="disabled" Value="@ToggleValues[feature.Name]" ValueChanged="@(async (v) => await OnSelectedValueChangedAsync(v, feature))">
@GetShownName(feature) @GetShownName(feature)
</Check> </Check>
@if (feature.Description != null) @if (feature.Description != null)

24
modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/RoleManagement.razor

@ -39,8 +39,8 @@
@* ************************* CREATE MODAL ************************* *@ @* ************************* CREATE MODAL ************************* *@
@if (HasCreatePermission) @if (HasCreatePermission)
{ {
<Modal @ref="CreateModal" Closing="@ClosingCreateModal"> <Modal @ref="CreateModal" Closing="@ClosingCreateModal" Centered="true">
<ModalContent Centered="true"> <ModalContent>
<Form id="CreateRoleForm"> <Form id="CreateRoleForm">
<ModalHeader> <ModalHeader>
<ModalTitle>@L["NewRole"]</ModalTitle> <ModalTitle>@L["NewRole"]</ModalTitle>
@ -51,17 +51,17 @@
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:RoleName"] *</FieldLabel> <FieldLabel>@L["DisplayName:RoleName"] *</FieldLabel>
<TextEdit @bind-Text="@NewEntity.Name" Autofocus="true"> <TextInput @bind-Value="@NewEntity.Name" Autofocus="true">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
<ExtensionProperties TEntityType="IdentityRoleCreateDto" TResourceType="IdentityResource" Entity="@NewEntity" LH="@LH" ModalType="ExtensionPropertyModalType.CreateModal" /> <ExtensionProperties TEntityType="IdentityRoleCreateDto" TResourceType="IdentityResource" Entity="@NewEntity" LH="@LH" ModalType="ExtensionPropertyModalType.CreateModal" />
</Validation> </Validation>
<Field> <Field>
<Check TValue="bool" @bind-Checked="@NewEntity.IsDefault">@L["DisplayName:IsDefault"]</Check> <Check TValue="bool" @bind-Value="@NewEntity.IsDefault">@L["DisplayName:IsDefault"]</Check>
<Check TValue="bool" @bind-Checked="@NewEntity.IsPublic">@L["DisplayName:IsPublic"]</Check> <Check TValue="bool" @bind-Value="@NewEntity.IsPublic">@L["DisplayName:IsPublic"]</Check>
</Field> </Field>
</Validations> </Validations>
</ModalBody> </ModalBody>
@ -76,8 +76,8 @@
@* ************************* EDIT MODAL ************************* *@ @* ************************* EDIT MODAL ************************* *@
@if (HasUpdatePermission) @if (HasUpdatePermission)
{ {
<Modal @ref="EditModal" Closing="@ClosingEditModal"> <Modal @ref="EditModal" Closing="@ClosingEditModal" Centered="true">
<ModalContent Centered="true"> <ModalContent>
<Form id="EditRoleForm"> <Form id="EditRoleForm">
<ModalHeader> <ModalHeader>
<ModalTitle>@L["Edit"]</ModalTitle> <ModalTitle>@L["Edit"]</ModalTitle>
@ -89,17 +89,17 @@
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:RoleName"] *</FieldLabel> <FieldLabel>@L["DisplayName:RoleName"] *</FieldLabel>
<TextEdit @bind-Text="EditingEntity.Name" Autofocus="true"> <TextInput @bind-Value="EditingEntity.Name" Autofocus="true">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
<ExtensionProperties TEntityType="IdentityRoleUpdateDto" TResourceType="IdentityResource" Entity="@EditingEntity" LH="@LH" ModalType="ExtensionPropertyModalType.EditModal" /> <ExtensionProperties TEntityType="IdentityRoleUpdateDto" TResourceType="IdentityResource" Entity="@EditingEntity" LH="@LH" ModalType="ExtensionPropertyModalType.EditModal" />
</Validation> </Validation>
<Field> <Field>
<Check TValue="bool" @bind-Checked="@EditingEntity.IsDefault">@L["DisplayName:IsDefault"]</Check> <Check TValue="bool" @bind-Value="@EditingEntity.IsDefault">@L["DisplayName:IsDefault"]</Check>
<Check TValue="bool" @bind-Checked="@EditingEntity.IsPublic">@L["DisplayName:IsPublic"]</Check> <Check TValue="bool" @bind-Value="@EditingEntity.IsPublic">@L["DisplayName:IsPublic"]</Check>
</Field> </Field>
</Validations> </Validations>
</ModalBody> </ModalBody>

70
modules/identity/src/Volo.Abp.Identity.Blazor/Pages/Identity/UserManagement.razor

@ -26,7 +26,7 @@
<Column ColumnSize="ColumnSize.Is4" class="form-group row" style="text-align:right;"> <Column ColumnSize="ColumnSize.Is4" class="form-group row" style="text-align:right;">
<label for="inputPassword" class="col-sm-4 col-form-label pt-1"> @L["Search"] </label> <label for="inputPassword" class="col-sm-4 col-form-label pt-1"> @L["Search"] </label>
<div class="col-sm-8"> <div class="col-sm-8">
<TextEdit class="form-control-sm" id="inputPassword" Text="@GetListInput.Filter" TextChanged="@OnSearchTextChanged" /> <TextInput class="form-control-sm" id="inputPassword" Value="@GetListInput.Filter" ValueChanged="@OnSearchTextChanged" />
</div> </div>
</Column> </Column>
@ -46,8 +46,8 @@
@* ************************* CREATE MODAL ************************* *@ @* ************************* CREATE MODAL ************************* *@
@if (HasCreatePermission) @if (HasCreatePermission)
{ {
<Modal @ref="CreateModal" Closing="@ClosingCreateModal"> <Modal @ref="CreateModal" Closing="@ClosingCreateModal" Centered="true">
<ModalContent Centered="true"> <ModalContent>
<Form id="CreateUserForm"> <Form id="CreateUserForm">
<ModalHeader> <ModalHeader>
<ModalTitle>@L["NewUser"]</ModalTitle> <ModalTitle>@L["NewUser"]</ModalTitle>
@ -65,31 +65,31 @@
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:UserName"] *</FieldLabel> <FieldLabel>@L["DisplayName:UserName"] *</FieldLabel>
<TextEdit @bind-Text="NewEntity.UserName" Autofocus="true"> <TextInput @bind-Value="NewEntity.UserName" Autofocus="true">
<Feedback> <Feedback>
<ValidationError /> <ValidationError />
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:Name"]</FieldLabel> <FieldLabel>@L["DisplayName:Name"]</FieldLabel>
<TextEdit @bind-Text="NewEntity.Name"> <TextInput @bind-Value="NewEntity.Name">
<Feedback> <Feedback>
<ValidationError /> <ValidationError />
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:Surname"]</FieldLabel> <FieldLabel>@L["DisplayName:Surname"]</FieldLabel>
<TextEdit @bind-Text="NewEntity.Surname"> <TextInput @bind-Value="NewEntity.Surname">
<Feedback> <Feedback>
<ValidationError /> <ValidationError />
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
@ -97,8 +97,8 @@
<FieldLabel>@L["DisplayName:Password"] *</FieldLabel> <FieldLabel>@L["DisplayName:Password"] *</FieldLabel>
<Addons> <Addons>
<Addon AddonType="AddonType.Body"> <Addon AddonType="AddonType.Body">
<TextEdit Role="@_passwordTextRole" @bind-Text="NewEntity.Password"> <TextInput Role="@_passwordTextRole" @bind-Value="NewEntity.Password">
</TextEdit> </TextInput>
</Addon> </Addon>
<Addon AddonType="AddonType.End"> <Addon AddonType="AddonType.End">
<Button Color="Color.Secondary" Clicked="@(() => ChangePasswordTextRole(null))"> <Button Color="Color.Secondary" Clicked="@(() => ChangePasswordTextRole(null))">
@ -112,29 +112,29 @@
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:Email"] *</FieldLabel> <FieldLabel>@L["DisplayName:Email"] *</FieldLabel>
<TextEdit @bind-Text="NewEntity.Email"> <TextInput @bind-Value="NewEntity.Email">
<Feedback> <Feedback>
<ValidationError /> <ValidationError />
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:PhoneNumber"]</FieldLabel> <FieldLabel>@L["DisplayName:PhoneNumber"]</FieldLabel>
<TextEdit @bind-Text="NewEntity.PhoneNumber"> <TextInput @bind-Value="NewEntity.PhoneNumber">
<Feedback> <Feedback>
<ValidationError /> <ValidationError />
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Field> <Field>
<Check TValue="bool" @bind-Checked="@NewEntity.IsActive">@L["DisplayName:IsActive"]</Check> <Check TValue="bool" @bind-Value="@NewEntity.IsActive">@L["DisplayName:IsActive"]</Check>
</Field> </Field>
<Field> <Field>
<Tooltip Text="@L["Description:LockoutEnabled"].Value" style="width: fit-content;" Placement="TooltipPlacement.Right" > <Tooltip Text="@L["Description:LockoutEnabled"].Value" style="width: fit-content;" Placement="TooltipPlacement.Right" >
<Check TValue="bool" @bind-Checked="@NewEntity.LockoutEnabled">@L["DisplayName:LockoutEnabled"] <Icon Name="IconName.InfoCircle"/> </Check> <Check TValue="bool" @bind-Value="@NewEntity.LockoutEnabled">@L["DisplayName:LockoutEnabled"] <Icon Name="IconName.InfoCircle"/> </Check>
</Tooltip> </Tooltip>
</Field> </Field>
<ExtensionProperties TEntityType="IdentityUserCreateDto" TResourceType="IdentityResource" Entity="@NewEntity" LH="@LH" ModalType="ExtensionPropertyModalType.CreateModal" /> <ExtensionProperties TEntityType="IdentityUserCreateDto" TResourceType="IdentityResource" Entity="@NewEntity" LH="@LH" ModalType="ExtensionPropertyModalType.CreateModal" />
@ -146,7 +146,7 @@
{ {
<Field> <Field>
<input type="hidden" @bind-value="@role.Name" /> <input type="hidden" @bind-value="@role.Name" />
<Check TValue="bool" @bind-Checked="@role.IsAssigned" Disabled="@(!role.IsAssignable)">@role.Name</Check> <Check TValue="bool" @bind-Value="@role.IsAssigned" Disabled="@(!role.IsAssignable)">@role.Name</Check>
</Field> </Field>
} }
} }
@ -167,8 +167,8 @@
@* ************************* EDIT MODAL ************************* *@ @* ************************* EDIT MODAL ************************* *@
@if (HasUpdatePermission) @if (HasUpdatePermission)
{ {
<Modal @ref="EditModal" Closing="@ClosingEditModal"> <Modal @ref="EditModal" Closing="@ClosingEditModal" Centered="true">
<ModalContent Centered="true"> <ModalContent>
<Form id="EditUserForm"> <Form id="EditUserForm">
<ModalHeader> <ModalHeader>
<ModalTitle>@L["Edit"]</ModalTitle> <ModalTitle>@L["Edit"]</ModalTitle>
@ -191,31 +191,31 @@
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:UserName"] *</FieldLabel> <FieldLabel>@L["DisplayName:UserName"] *</FieldLabel>
<TextEdit @bind-Text="EditingEntity.UserName" Autofocus="true"> <TextInput @bind-Value="EditingEntity.UserName" Autofocus="true">
<Feedback> <Feedback>
<ValidationError /> <ValidationError />
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:Name"]</FieldLabel> <FieldLabel>@L["DisplayName:Name"]</FieldLabel>
<TextEdit @bind-Text="EditingEntity.Name"> <TextInput @bind-Value="EditingEntity.Name">
<Feedback> <Feedback>
<ValidationError /> <ValidationError />
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:Surname"]</FieldLabel> <FieldLabel>@L["DisplayName:Surname"]</FieldLabel>
<TextEdit @bind-Text="EditingEntity.Surname"> <TextInput @bind-Value="EditingEntity.Surname">
<Feedback> <Feedback>
<ValidationError /> <ValidationError />
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
@ -223,8 +223,8 @@
<FieldLabel>@L["DisplayName:Password"]</FieldLabel> <FieldLabel>@L["DisplayName:Password"]</FieldLabel>
<Addons> <Addons>
<Addon AddonType="AddonType.Body"> <Addon AddonType="AddonType.Body">
<TextEdit Role="@_passwordTextRole" @bind-Text="EditingEntity.Password"> <TextInput Role="@_passwordTextRole" @bind-Value="EditingEntity.Password">
</TextEdit> </TextInput>
</Addon> </Addon>
<Addon AddonType="AddonType.End"> <Addon AddonType="AddonType.End">
<Button Color="Color.Secondary" Clicked="@(() => ChangePasswordTextRole(null))"> <Button Color="Color.Secondary" Clicked="@(() => ChangePasswordTextRole(null))">
@ -238,32 +238,32 @@
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:Email"] *</FieldLabel> <FieldLabel>@L["DisplayName:Email"] *</FieldLabel>
<TextEdit @bind-Text="EditingEntity.Email"> <TextInput @bind-Value="EditingEntity.Email">
<Feedback> <Feedback>
<ValidationError /> <ValidationError />
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:PhoneNumber"]</FieldLabel> <FieldLabel>@L["DisplayName:PhoneNumber"]</FieldLabel>
<TextEdit @bind-Text="EditingEntity.PhoneNumber"> <TextInput @bind-Value="EditingEntity.PhoneNumber">
<Feedback> <Feedback>
<ValidationError /> <ValidationError />
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
@if (!IsEditCurrentUser) @if (!IsEditCurrentUser)
{ {
<Field> <Field>
<Check TValue="bool" @bind-Checked="EditingEntity.IsActive">@L["DisplayName:IsActive"]</Check> <Check TValue="bool" @bind-Value="EditingEntity.IsActive">@L["DisplayName:IsActive"]</Check>
</Field> </Field>
} }
<Field> <Field>
<Tooltip Text="@L["Description:LockoutEnabled"].Value" style="width: fit-content;" Placement="TooltipPlacement.Right" > <Tooltip Text="@L["Description:LockoutEnabled"].Value" style="width: fit-content;" Placement="TooltipPlacement.Right" >
<Check TValue="bool" @bind-Checked="EditingEntity.LockoutEnabled">@L["DisplayName:LockoutEnabled"] <Icon Name="IconName.InfoCircle"/> </Check> <Check TValue="bool" @bind-Value="EditingEntity.LockoutEnabled">@L["DisplayName:LockoutEnabled"] <Icon Name="IconName.InfoCircle"/> </Check>
</Tooltip> </Tooltip>
</Field> </Field>
<ExtensionProperties TEntityType="IdentityUserUpdateDto" TResourceType="IdentityResource" Entity="@EditingEntity" LH="@LH" ModalType="ExtensionPropertyModalType.EditModal" /> <ExtensionProperties TEntityType="IdentityUserUpdateDto" TResourceType="IdentityResource" Entity="@EditingEntity" LH="@LH" ModalType="ExtensionPropertyModalType.EditModal" />
@ -277,7 +277,7 @@
{ {
<Field> <Field>
<input type="hidden" @bind-value="@role.Name" /> <input type="hidden" @bind-value="@role.Name" />
<Check TValue="bool" @bind-Checked="@role.IsAssigned" Disabled="@(!role.IsAssignable)">@role.Name</Check> <Check TValue="bool" @bind-Value="@role.IsAssigned" Disabled="@(!role.IsAssignable)">@role.Name</Check>
</Field> </Field>
} }
} }

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

@ -1,6 +1,6 @@
@inherits Volo.Abp.AspNetCore.Components.AbpComponentBase @inherits Volo.Abp.AspNetCore.Components.AbpComponentBase
<Modal @ref="_modal" Closing="@ClosingModal"> <Modal @ref="_modal" Closing="@ClosingModal" Size="ModalSize.Large" Centered="true">
<ModalContent Size="ModalSize.Large" Centered="true"> <ModalContent>
<ModalHeader> <ModalHeader>
<ModalTitle>@L["Permissions"] - @_entityDisplayName</ModalTitle> <ModalTitle>@L["Permissions"] - @_entityDisplayName</ModalTitle>
<CloseButton Clicked="CloseModal" /> <CloseButton Clicked="CloseModal" />
@ -17,14 +17,14 @@
</span> </span>
</Addon> </Addon>
<Addon AddonType="AddonType.Body"> <Addon AddonType="AddonType.Body">
<TextEdit Text="@_permissionGroupSearchText" TextChanged="OnPermissionGroupSearchTextChangedAsync"/> <TextInput Value="@_permissionGroupSearchText" ValueChanged="OnPermissionGroupSearchTextChangedAsync"/>
</Addon> </Addon>
</Addons> </Addons>
</Field> </Field>
</Column> </Column>
<Column ColumnSize="ColumnSize.IsAuto"> <Column ColumnSize="ColumnSize.IsAuto">
<Field> <Field>
<Check Disabled="_selectAllDisabled" Cursor="Cursor.Pointer" CheckedChanged="@GrantAllAsync" Checked="@GrantAll" TValue="bool" Indeterminate="@GrantAny"> <Check Disabled="_selectAllDisabled" Cursor="Cursor.Pointer" ValueChanged="@GrantAllAsync" Value="@GrantAll" TValue="bool" Indeterminate="@GrantAny">
@L["SelectAllInAllTabs"] @L["SelectAllInAllTabs"]
</Check> </Check>
</Field> </Field>
@ -68,9 +68,9 @@
<Field> <Field>
<Check <Check
Disabled="@(IsPermissionGroupDisabled(group))" Disabled="@(IsPermissionGroupDisabled(group))"
Checked="@(group.Permissions.All(x => x.IsGranted))" Value="@(group.Permissions.All(x => x.IsGranted))"
Cursor="Cursor.Pointer" Cursor="Cursor.Pointer"
CheckedChanged="@(b => GroupGrantAllChanged(b, group))" ValueChanged="@(b => GroupGrantAllChanged(b, group))"
TValue="bool"> TValue="bool">
@L["SelectAllInThisTab"] @L["SelectAllInThisTab"]
</Check> </Check>
@ -84,8 +84,8 @@
<Check <Check
Disabled="@(IsDisabledPermission(permission))" Disabled="@(IsDisabledPermission(permission))"
Cursor="Cursor.Pointer" Cursor="Cursor.Pointer"
Checked="@permission.IsGranted" Value="@permission.IsGranted"
CheckedChanged="@(async (b) => await PermissionChanged(b, group, permission))" ValueChanged="@(async (b) => await PermissionChanged(b, group, permission))"
TValue="bool"> TValue="bool">
@GetShownName(permission) @GetShownName(permission)
</Check> </Check>

42
modules/permission-management/src/Volo.Abp.PermissionManagement.Blazor/Components/ResourcePermissionManagementModal.razor

@ -4,8 +4,8 @@
@inherits Volo.Abp.AspNetCore.Components.AbpComponentBase @inherits Volo.Abp.AspNetCore.Components.AbpComponentBase
@inject AbpBlazorMessageLocalizerHelper<AbpPermissionManagementResource> LH @inject AbpBlazorMessageLocalizerHelper<AbpPermissionManagementResource> LH
<Modal @ref="Modal" Closing="@ClosingModal"> <Modal @ref="Modal" Closing="@ClosingModal" Size="ModalSize.ExtraLarge" Centered="true">
<ModalContent Size="ModalSize.ExtraLarge" Centered="true"> <ModalContent>
<ModalHeader> <ModalHeader>
<ModalTitle>@L["ResourcePermissions"] - @ResourceDisplayName</ModalTitle> <ModalTitle>@L["ResourcePermissions"] - @ResourceDisplayName</ModalTitle>
<CloseButton Clicked="CloseModal" /> <CloseButton Clicked="CloseModal" />
@ -23,7 +23,7 @@
PageSize="PageSize"> PageSize="PageSize">
<DataGridColumns> <DataGridColumns>
<DataGridColumn <DataGridColumn
Width="150px" Width="Width.Px( 150 )"
Sortable="false" Sortable="false"
TItem="ResourcePermissionGrantInfoDto" TItem="ResourcePermissionGrantInfoDto"
Field="@nameof(ResourcePermissionGrantInfoDto.ProviderName)" Field="@nameof(ResourcePermissionGrantInfoDto.ProviderName)"
@ -34,10 +34,10 @@
@L["Actions"] @L["Actions"]
</DropdownToggle> </DropdownToggle>
<DropdownMenu> <DropdownMenu>
<DropdownItem Clicked="() => OpenEditModalAsync(context)"> <DropdownItem Clicked="() => OpenEditModalAsync(context.Item)">
@L["Edit"] @L["Edit"]
</DropdownItem> </DropdownItem>
<DropdownItem Clicked="() => DeleteResourcePermissionAsync(context)"> <DropdownItem Clicked="() => DeleteResourcePermissionAsync(context.Item)">
@L["Delete"] @L["Delete"]
</DropdownItem> </DropdownItem>
</DropdownMenu> </DropdownMenu>
@ -47,17 +47,17 @@
<DataGridColumn TItem="ResourcePermissionGrantInfoDto" Field="@nameof(ResourcePermissionGrantInfoDto.ProviderName)" Caption="@L["ResourcePermissionTarget"]" Sortable="false"> <DataGridColumn TItem="ResourcePermissionGrantInfoDto" Field="@nameof(ResourcePermissionGrantInfoDto.ProviderName)" Caption="@L["ResourcePermissionTarget"]" Sortable="false">
<DisplayTemplate> <DisplayTemplate>
@{ @{
<Tooltip Text="@context.ProviderNameDisplayName" Placement="TooltipPlacement.Right" Style="float: left;"> <Tooltip Text="@context.Item.ProviderNameDisplayName" Placement="TooltipPlacement.Right" Style="float: left;">
<span class="d-inline-block bg-light rounded-pill px-2 me-1 ms-1 mb-1">@context.ProviderName</span> <span class="d-inline-block bg-light rounded-pill px-2 me-1 ms-1 mb-1">@context.Item.ProviderName</span>
</Tooltip> </Tooltip>
@context.ProviderDisplayName @context.Item.ProviderDisplayName
} }
</DisplayTemplate> </DisplayTemplate>
</DataGridColumn> </DataGridColumn>
<DataGridColumn TItem="ResourcePermissionGrantInfoDto" Field="@nameof(ResourcePermissionGrantInfoDto.Permissions)" Caption="@L["ResourcePermissionPermissions"]" Sortable="false"> <DataGridColumn TItem="ResourcePermissionGrantInfoDto" Field="@nameof(ResourcePermissionGrantInfoDto.Permissions)" Caption="@L["ResourcePermissionPermissions"]" Sortable="false">
<DisplayTemplate> <DisplayTemplate>
@{ @{
foreach (var permission in context.Permissions) foreach (var permission in context.Item.Permissions)
{ {
<span class="d-inline-block bg-light rounded-pill px-2 me-1 mb-1">@permission.DisplayName</span> <span class="d-inline-block bg-light rounded-pill px-2 me-1 mb-1">@permission.DisplayName</span>
} }
@ -90,8 +90,8 @@
</ModalContent> </ModalContent>
</Modal> </Modal>
<Modal @ref="CreateModal" Closing="@ClosingCreateModal"> <Modal @ref="CreateModal" Closing="@ClosingCreateModal" Centered="true">
<ModalContent Centered="true"> <ModalContent>
<Form> <Form>
<ModalHeader> <ModalHeader>
<ModalTitle>@L["AddResourcePermission"]</ModalTitle> <ModalTitle>@L["AddResourcePermission"]</ModalTitle>
@ -101,8 +101,8 @@
<Validations @ref="@CreateValidationsRef" Model="@CreateEntity" ValidateOnLoad="false"> <Validations @ref="@CreateValidationsRef" Model="@CreateEntity" ValidateOnLoad="false">
<div class="mb-3"> <div class="mb-3">
<RadioGroup TValue="string" <RadioGroup TValue="string"
CheckedValue="@CurrentLookupService" Value="@CurrentLookupService"
CheckedValueChanged="@OnLookupServiceCheckedValueChanged"> ValueChanged="@OnLookupServiceCheckedValueChanged">
@foreach(var keyLookupService in ResourceProviderKeyLookupServices) @foreach(var keyLookupService in ResourceProviderKeyLookupServices)
{ {
<Radio Value="@(keyLookupService.Name)">@keyLookupService.DisplayName</Radio> <Radio Value="@(keyLookupService.Name)">@keyLookupService.DisplayName</Radio>
@ -122,20 +122,20 @@
class="mt-1"> class="mt-1">
</Autocomplete> </Autocomplete>
<Validation @ref="ProviderKeyValidationRef" Validator="ValidateProviderKey"> <Validation @ref="ProviderKeyValidationRef" Validator="ValidateProviderKey">
<TextEdit Style="display: none;"> <TextInput Style="display: none;">
<Feedback> <Feedback>
<ValidationError></ValidationError> <ValidationError></ValidationError>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Validation> </Validation>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<h4>@L["ResourcePermissionPermissions"]</h4> <h4>@L["ResourcePermissionPermissions"]</h4>
<Switch TValue="bool" Checked="CreateEntity.Permissions.All(x => x.IsGranted)" CheckedChanged="GrantAllAsync">@L["GrantAllResourcePermissions"]</Switch> <Switch TValue="bool" Value="CreateEntity.Permissions.All(x => x.IsGranted)" ValueChanged="GrantAllAsync">@L["GrantAllResourcePermissions"]</Switch>
<div class="mt-2"> <div class="mt-2">
@foreach (var permission in CreateEntity.Permissions) @foreach (var permission in CreateEntity.Permissions)
{ {
<Check TValue="bool" Checked="@permission.IsGranted" CheckedChanged="@((c) => OnPermissionCheckedChanged(permission, c))">@permission.DisplayName</Check> <Check TValue="bool" Value="@permission.IsGranted" ValueChanged="@((c) => OnPermissionCheckedChanged(permission, c))">@permission.DisplayName</Check>
} }
</div> </div>
</div> </div>
@ -149,8 +149,8 @@
</ModalContent> </ModalContent>
</Modal> </Modal>
<Modal @ref="EditModal" Closing="@ClosingEditModal"> <Modal @ref="EditModal" Closing="@ClosingEditModal" Centered="true">
<ModalContent Centered="true"> <ModalContent>
<Form> <Form>
<ModalHeader> <ModalHeader>
<ModalTitle>@L["UpdateResourcePermission"]</ModalTitle> <ModalTitle>@L["UpdateResourcePermission"]</ModalTitle>
@ -160,11 +160,11 @@
<Validations @ref="@EditValidationsRef" Model="@EditEntity" ValidateOnLoad="false"> <Validations @ref="@EditValidationsRef" Model="@EditEntity" ValidateOnLoad="false">
<div class="mb-3"> <div class="mb-3">
<h4>@L["ResourcePermissionPermissions"]</h4> <h4>@L["ResourcePermissionPermissions"]</h4>
<Switch TValue="bool" Checked="EditEntity.Permissions.All(x => x.IsGranted)" CheckedChanged="GrantAllAsync">@L["GrantAllResourcePermissions"]</Switch> <Switch TValue="bool" Value="EditEntity.Permissions.All(x => x.IsGranted)" ValueChanged="GrantAllAsync">@L["GrantAllResourcePermissions"]</Switch>
<div class="mt-2"> <div class="mt-2">
@foreach (var permission in EditEntity.Permissions) @foreach (var permission in EditEntity.Permissions)
{ {
<Check TValue="bool" Checked="@permission.IsGranted" CheckedChanged="@((c) => OnPermissionCheckedChanged(permission, c))">@permission.DisplayName</Check> <Check TValue="bool" Value="@permission.IsGranted" ValueChanged="@((c) => OnPermissionCheckedChanged(permission, c))">@permission.DisplayName</Check>
} }
</div> </div>
</div> </div>

52
modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/EmailSettingGroup/EmailSettingGroupViewComponent.razor

@ -11,79 +11,79 @@
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DefaultFromDisplayName"] *</FieldLabel> <FieldLabel>@L["DefaultFromDisplayName"] *</FieldLabel>
<TextEdit @bind-Text="@EmailSettings.DefaultFromDisplayName"> <TextInput @bind-Value="@EmailSettings.DefaultFromDisplayName">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DefaultFromAddress"] *</FieldLabel> <FieldLabel>@L["DefaultFromAddress"] *</FieldLabel>
<TextEdit @bind-Text="@EmailSettings.DefaultFromAddress"> <TextInput @bind-Value="@EmailSettings.DefaultFromAddress">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["SmtpHost"]</FieldLabel> <FieldLabel>@L["SmtpHost"]</FieldLabel>
<TextEdit @bind-Text="@EmailSettings.SmtpHost"> <TextInput @bind-Value="@EmailSettings.SmtpHost">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["SmtpPort"]</FieldLabel> <FieldLabel>@L["SmtpPort"]</FieldLabel>
<NumericEdit TValue="int" @bind-Value="@EmailSettings.SmtpPort"> <NumericInput TValue="int" @bind-Value="@EmailSettings.SmtpPort">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</NumericEdit> </NumericInput>
</Field> </Field>
</Validation> </Validation>
<Field> <Field>
<Check TValue="bool" @bind-Checked="@EmailSettings.SmtpEnableSsl">@L["SmtpEnableSsl"]</Check> <Check TValue="bool" @bind-Value="@EmailSettings.SmtpEnableSsl">@L["SmtpEnableSsl"]</Check>
</Field> </Field>
<Field> <Field>
<Check TValue="bool" @bind-Checked="@EmailSettings.SmtpUseDefaultCredentials">@L["SmtpUseDefaultCredentials"]</Check> <Check TValue="bool" @bind-Value="@EmailSettings.SmtpUseDefaultCredentials">@L["SmtpUseDefaultCredentials"]</Check>
</Field> </Field>
@if (!EmailSettings.SmtpUseDefaultCredentials) @if (!EmailSettings.SmtpUseDefaultCredentials)
{ {
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["SmtpDomain"]</FieldLabel> <FieldLabel>@L["SmtpDomain"]</FieldLabel>
<TextEdit @bind-Text="@EmailSettings.SmtpDomain"> <TextInput @bind-Value="@EmailSettings.SmtpDomain">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["SmtpUserName"]</FieldLabel> <FieldLabel>@L["SmtpUserName"]</FieldLabel>
<TextEdit @bind-Text="@EmailSettings.SmtpUserName"> <TextInput @bind-Value="@EmailSettings.SmtpUserName">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["SmtpPassword"]</FieldLabel> <FieldLabel>@L["SmtpPassword"]</FieldLabel>
<TextEdit Role="TextRole.Password" @bind-Text="@EmailSettings.SmtpPassword" Placeholder="@L["SmtpPasswordPlaceholder"].Value"> <TextInput Role="TextRole.Password" @bind-Value="@EmailSettings.SmtpPassword" Placeholder="@L["SmtpPasswordPlaceholder"].Value">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
} }
@ -105,8 +105,8 @@
@if (HasSendTestEmailPermission) @if (HasSendTestEmailPermission)
{ {
<Modal @ref="SendTestEmailModal"> <Modal @ref="SendTestEmailModal" Centered="true">
<ModalContent Centered="true"> <ModalContent>
<Form id="SendTestEmailForm"> <Form id="SendTestEmailForm">
<ModalHeader> <ModalHeader>
<ModalTitle>@L["SendTestEmail"]</ModalTitle> <ModalTitle>@L["SendTestEmail"]</ModalTitle>
@ -117,41 +117,41 @@
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["SenderEmailAddress"]</FieldLabel> <FieldLabel>@L["SenderEmailAddress"]</FieldLabel>
<TextEdit @bind-Text="@SendTestEmailInput.SenderEmailAddress" Autofocus="true"> <TextInput @bind-Value="@SendTestEmailInput.SenderEmailAddress" Autofocus="true">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["TargetEmailAddress"]</FieldLabel> <FieldLabel>@L["TargetEmailAddress"]</FieldLabel>
<TextEdit @bind-Text="@SendTestEmailInput.TargetEmailAddress"> <TextInput @bind-Value="@SendTestEmailInput.TargetEmailAddress">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["Subject"]</FieldLabel> <FieldLabel>@L["Subject"]</FieldLabel>
<TextEdit @bind-Text="@SendTestEmailInput.Subject"> <TextInput @bind-Value="@SendTestEmailInput.Subject">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["Body"]</FieldLabel> <FieldLabel>@L["Body"]</FieldLabel>
<TextEdit @bind-Text="@SendTestEmailInput.Body"> <TextInput @bind-Value="@SendTestEmailInput.Body">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
</Validations> </Validations>

2
modules/setting-management/src/Volo.Abp.SettingManagement.Blazor/Pages/SettingManagement/TimeZoneSettingGroup/TimeZoneSettingGroupViewComponent.razor

@ -9,7 +9,7 @@
<Column> <Column>
<Field> <Field>
<FieldLabel>@L["DisplayName:Timezone"] *</FieldLabel> <FieldLabel>@L["DisplayName:Timezone"] *</FieldLabel>
<Select TValue="string" SelectedValue="TimezoneSettings.Timezone" SelectedValueChanged="OnSelectedValueChangedAsync"> <Select TValue="string" Value="TimezoneSettings.Timezone" ValueChanged="OnSelectedValueChangedAsync">
@foreach (var item in TimezoneSettings.TimeZoneItems) @foreach (var item in TimezoneSettings.TimeZoneItems)
{ {
<SelectItem Value="item.Value">@item.Name</SelectItem> <SelectItem Value="item.Value">@item.Name</SelectItem>

24
modules/tenant-management/src/Volo.Abp.TenantManagement.Blazor/Pages/TenantManagement/TenantManagement.razor

@ -38,8 +38,8 @@
@* ************************* CREATE MODAL ************************* *@ @* ************************* CREATE MODAL ************************* *@
@if ( HasCreatePermission ) @if ( HasCreatePermission )
{ {
<Modal @ref="CreateModal" Closing="@ClosingCreateModal"> <Modal @ref="CreateModal" Closing="@ClosingCreateModal" Centered="true">
<ModalContent Centered="true"> <ModalContent>
<Form id="CreateTenantForm"> <Form id="CreateTenantForm">
<ModalHeader> <ModalHeader>
<ModalTitle>@L["NewTenant"]</ModalTitle> <ModalTitle>@L["NewTenant"]</ModalTitle>
@ -50,21 +50,21 @@
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["TenantName"] *</FieldLabel> <FieldLabel>@L["TenantName"] *</FieldLabel>
<TextEdit @bind-Text="@NewEntity.Name" Autofocus="true"> <TextInput @bind-Value="@NewEntity.Name" Autofocus="true">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["DisplayName:AdminEmailAddress"] *</FieldLabel> <FieldLabel>@L["DisplayName:AdminEmailAddress"] *</FieldLabel>
<TextEdit Role="@TextRole.Email" @bind-Text="@NewEntity.AdminEmailAddress"> <TextInput Role="@TextRole.Email" @bind-Value="@NewEntity.AdminEmailAddress">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
@ -72,8 +72,8 @@
<FieldLabel>@L["DisplayName:AdminPassword"] *</FieldLabel> <FieldLabel>@L["DisplayName:AdminPassword"] *</FieldLabel>
<Addons> <Addons>
<Addon AddonType="AddonType.Body"> <Addon AddonType="AddonType.Body">
<TextEdit Role="ShowPassword ? TextRole.Text : TextRole.Password" @bind-Text="@NewEntity.AdminPassword"> <TextInput Role="ShowPassword ? TextRole.Text : TextRole.Password" @bind-Value="@NewEntity.AdminPassword">
</TextEdit> </TextInput>
</Addon> </Addon>
<Addon AddonType="AddonType.End"> <Addon AddonType="AddonType.End">
<Button Color="Color.Secondary" Clicked="@(() => TogglePasswordVisibility())"> <Button Color="Color.Secondary" Clicked="@(() => TogglePasswordVisibility())">
@ -99,8 +99,8 @@
@* ************************* EDIT MODAL ************************* *@ @* ************************* EDIT MODAL ************************* *@
@if ( HasUpdatePermission ) @if ( HasUpdatePermission )
{ {
<Modal @ref="EditModal" Closing="@ClosingEditModal"> <Modal @ref="EditModal" Closing="@ClosingEditModal" Centered="true">
<ModalContent Centered="true"> <ModalContent>
<Form id="EditTenantForm"> <Form id="EditTenantForm">
<ModalHeader> <ModalHeader>
<ModalTitle>@L["Edit"]</ModalTitle> <ModalTitle>@L["Edit"]</ModalTitle>
@ -111,11 +111,11 @@
<Validation MessageLocalizer="@LH.Localize"> <Validation MessageLocalizer="@LH.Localize">
<Field> <Field>
<FieldLabel>@L["TenantName"] *</FieldLabel> <FieldLabel>@L["TenantName"] *</FieldLabel>
<TextEdit @bind-Text="@EditingEntity.Name" Autofocus="true"> <TextInput @bind-Value="@EditingEntity.Name" Autofocus="true">
<Feedback> <Feedback>
<ValidationError/> <ValidationError/>
</Feedback> </Feedback>
</TextEdit> </TextInput>
</Field> </Field>
</Validation> </Validation>
</Validations> </Validations>

4
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server.Mongo/MyCompanyName.MyProjectName.Blazor.Server.Mongo.csproj

@ -8,8 +8,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" /> <PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" />
</ItemGroup> </ItemGroup>

4
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj

@ -8,8 +8,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" /> <PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" />
</ItemGroup> </ItemGroup>

4
templates/app-nolayers/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client/MyCompanyName.MyProjectName.Blazor.WebAssembly.Client.csproj

@ -9,8 +9,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.2" />
</ItemGroup> </ItemGroup>

4
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Client/MyCompanyName.MyProjectName.Blazor.Client.csproj

@ -12,8 +12,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.2" />
</ItemGroup> </ItemGroup>

4
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server.Tiered/MyCompanyName.MyProjectName.Blazor.Server.Tiered.csproj

@ -14,8 +14,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" /> <PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="10.0.2" />

4
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.Server/MyCompanyName.MyProjectName.Blazor.Server.csproj

@ -15,8 +15,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.2" />
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" /> <PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" />
</ItemGroup> </ItemGroup>

4
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Client.csproj

@ -13,8 +13,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.2" />
</ItemGroup> </ItemGroup>

4
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.Client.csproj

@ -13,8 +13,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.2" />
</ItemGroup> </ItemGroup>

4
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered/MyCompanyName.MyProjectName.Blazor.WebApp.Tiered.csproj

@ -16,8 +16,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.2" />
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" /> <PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="10.0.2" />

4
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Blazor.WebApp/MyCompanyName.MyProjectName.Blazor.WebApp.csproj

@ -16,8 +16,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.2" />
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" /> <PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" />
</ItemGroup> </ItemGroup>

4
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Host.Client/MyCompanyName.MyProjectName.Blazor.Host.Client.csproj

@ -10,8 +10,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.2" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.2" />
</ItemGroup> </ItemGroup>

4
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Blazor.Server.Host/MyCompanyName.MyProjectName.Blazor.Server.Host.csproj

@ -13,8 +13,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Blazorise.Bootstrap5" Version="1.8.8" /> <PackageReference Include="Blazorise.Bootstrap5" Version="2.0.0" />
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="1.8.8" /> <PackageReference Include="Blazorise.Icons.FontAwesome" Version="2.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" /> <PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" /> <PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.2" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="10.0.2" />

Loading…
Cancel
Save