Skip to content

Commit

Permalink
chore: merge feature into master (#1350)
Browse files Browse the repository at this point in the history
* feat(module: table): add a method to get query model (#1202)

* feat(module: table): add OnExpand event (#1208)

* feat(module: table): add summary (#1218)

* feat(module: table): add summary row

* feat: add fixed summary cell

* feat(module: InputNumber): Add long-click and keyboard operation (#1235)

* feat(module: InputNumber): Add long click and keyboard event

1. When hold mouse down button will always trigger the increase or decrease
2. Add event listener to "ArrowUp" and "ArrowDown" key

* feat(module: InputNumber): Add long click and keyboard event

1. When hold mouse down button will always trigger the increase or decrease
2. Add event listener to "ArrowUp" and "ArrowDown" key

* fix null reference exception

Co-authored-by: ElderJames <shunjiey@hotmail.com>

* refactor(module: pagination): cover the apis of react (#1220)

* feat(module: config-provider): support RTL (#1238)

* feat(module: config-provider): support RTL

* add rtl for each component

* fix rtl for pagination

* add rtl for overlay

* chore: sync ant-design v4.14.0 (#1249)

* feat(module: tag): add closing event (#1268)

* tag add onclosing
event

* clean code

* translate the comment

* translation

Co-authored-by: James Yeung <shunjiey@hotmail.com>

* chore: sync ant-design v4.15.0 (#1281)

* feat: add built-in themes (#1286)

* feat: add themes

* add docs theming styles

* fix the RTL for FixedWidgets

* fix aliyun theme

* fix docs style

* feat(module: form): Form lable supports left alignment (#1292)

* feat: Form lable supports left alignment

* Update and rename components/grid/Col.razor.cs to 组件/格网/Col.razor.cs

* Delete Col.razor.cs

* no message

* PR:1292

* typo LabelAlign

* add the property in Col instead FormItem

* clean code

Co-authored-by: James Yeung <shunjiey@hotmail.com>

* feat(module: upload): missing and new event (#1302)

* feat(module:upload): missing and new event

* docs(module:upload): new events (missing Chinese)

Co-authored-by: James Yeung <shunjiey@hotmail.com>

* refactor: unified use of FeedbackComponent for modal comfirm and drawer  (#1263)

* refactor: support to use the same template for confirm and modal

* refactor: support to use the same template for drawer

* refactor: separate interface IOkCancelRef

* chore: modify EventUtil class summary

Co-authored-by: James Yeung <shunjiey@hotmail.com>

* feat(module: alert): add message template and loop banner demo (#1250)

* feat(Alert): added alert loop component

* fix: move cmp into main

* feat: add parameters for looping text

* feat: add new messages loop

* fix: create new internal looptext cmp

* doc: add demo

* doc: add demo markdown

* doc: update alert api

* doc: update cn docs

* fix: add missing dependency

* fix: update param name

* impleement loop text with css

* fix the document

Co-authored-by: James Yeung <shunjiey@hotmail.com>

* feat(module: table): add support for Display attribute (#1310)

feat(module:table): add support for Display attribute

Display attribute is widely used to specify display text for entity properties.
Table component should get column names from Display attribute instances.

Closes #1278

* test: add TestKit for public tests (#1248)

* test: change folder structure and add new TestKit csproj for public testing of AntDesign-based applications

* docs: added CN and EN docs about TestKit

* fix doc translate

* change the directory structure

Co-authored-by: Patryk Grzelak <pgrzelak@mutate.app>
Co-authored-by: James Yeung <shunjiey@hotmail.com>

* feat(module: space): add wrap, split and size array (#1314)

* fix(module: datepicker): incorrect in RTL mode (#1300)

* fix(module: dropdown): default PlacementType is incorrect in RTL mode

* fix(module: datepicker): not correct in RTL mode

* fix(module: datepicker): styles is incorrect when switch to LTR from RTL

Co-authored-by: James Yeung <shunjiey@hotmail.com>

* docs: fix default css link (#1318)

* fix(module: table): bring PR1208 to PR1303 merge master into feature (#1326)

* feat(module: pagination): add TotalBoundaryShowSizeChanger parameter (#1325)

* feat(module: pagination): add TotalBoundaryShowSizeChanger

* docs(module: pagination): update API

Co-authored-by: James Yeung <shunjiey@hotmail.com>

* docs: dynamic primary color changing (#1332)

* feat(docs): change color dynamically

* docs: dynamic primary color changing

* fix file path

* delete the script

* feat(module: table): add build-in filters (#1267)

* tablefilter-moreoptions

* tablefilter-moreoptions

* tablefilter-moreoptions

* tablefilter-moreoptions

* tablefilter-moreoptions

* fix demo and docs

Co-authored-by: James Yeung <shunjiey@hotmail.com>

* fix(module: tooltip): wrong popup direction (#1348)

* fix merge conflicts

Co-authored-by: Andrzej Bakun <andrzej@neelyc.com.cy>
Co-authored-by: LingDev <lingjing0921@live.com>
Co-authored-by: Zonciu Liang <zonciu@zonciu.com>
Co-authored-by: TimChen <TimChen44@users.noreply.github.com>
Co-authored-by: unsung189 <52531536+unsung189@users.noreply.github.com>
Co-authored-by: zxyao <zxyao145@gmail.com>
Co-authored-by: Patrick <42546986+MutatePat@users.noreply.github.com>
Co-authored-by: anranruye <54608128+anranruye@users.noreply.github.com>
Co-authored-by: Patryk Grzelak <pgrzelak@mutate.app>
Co-authored-by: 笨木头 <musicvs@163.com>
Co-authored-by: Magehernan <magehernan@gmail.com>
Co-authored-by: ldsenow <ldsenow@gmail.com>
Co-authored-by: Leishi <lluo@octet.com>
Co-authored-by: YMohd <31305504+YMohd@users.noreply.github.com>
  • Loading branch information
15 people committed Apr 15, 2021
2 parents 242084e + 3742969 commit e8965eb
Show file tree
Hide file tree
Showing 326 changed files with 12,348 additions and 1,990 deletions.
1 change: 1 addition & 0 deletions .github/workflows/nightly-build.yml
Expand Up @@ -82,6 +82,7 @@ jobs:
echo "Version: ${FULL_VERSION}"
echo "::set-output name=package_version::${FULL_VERSION}"
dotnet pack components/AntDesign.csproj /p:PackageVersion=${FULL_VERSION} -c Release -o publish
dotnet pack tests/AntDesign.TestKit/AntDesign.TestKit.csproj /p:PackageVersion=${FULL_VERSION} -c Release -o publish
env:
next_version: ${{ steps.get_next_version.outputs.next_version }}

Expand Down
1 change: 1 addition & 0 deletions .github/workflows/release.yml
Expand Up @@ -39,6 +39,7 @@ jobs:
npm install
dotnet build
dotnet pack components/AntDesign.csproj /p:PackageVersion=$VERSION -c Release -o publish
dotnet pack tests/AntDesign.TestKit/AntDesign.TestKit.csproj /p:PackageVersion=$VERSION -c Release -o publish
dotnet nuget push publish/*.nupkg -s https://api.nuget.org/v3/index.json -k $NUGET_API_KEY --skip-duplicate
- name: Publish Docs 🎉
Expand Down
3 changes: 2 additions & 1 deletion .gitignore
Expand Up @@ -340,7 +340,7 @@ ASALocalRun/
healthchecksdb
package-lock.json
/components/wwwroot/less
/components/wwwroot/css/ant-design-blazor.css
/components/wwwroot/css
/components/wwwroot/js/ant-design-blazor.js
/components/wwwroot/js/ant-design-blazor.js.map
/components/AntDesign.xml
Expand All @@ -350,3 +350,4 @@ package-lock.json
/AntDesign.Docs/wwwroot/docs
coverage.cobertura.xml
scripts/previewEditor/index.html
/site/AntDesign.Docs/wwwroot/css
21 changes: 15 additions & 6 deletions AntDesign.sln
Expand Up @@ -29,7 +29,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AntDesign.Docs.Build.CLI",
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "hosts", "hosts", "{752F5AE8-BA08-4C41-B9B2-D2ED12727E63}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AntDesign.Tests", "tests\AntDesign.Tests.csproj", "{B2DC89BD-838C-459C-A32A-98F877479988}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AntDesign.TestKit", "tests\AntDesign.TestKit\AntDesign.TestKit.csproj", "{7193BE83-12C1-4B35-8197-C28D20FBA1E6}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AntDesign.Tests", "tests\AntDesign.Tests\AntDesign.Tests.csproj", "{51D7507D-48BA-43BB-8223-CE35A2D7D0D8}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{DFD13180-D1BF-44DA-BEBE-4A54EFDEFFE2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down Expand Up @@ -61,10 +65,14 @@ Global
{5A765767-0766-433D-B78D-97D8F29CA6A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5A765767-0766-433D-B78D-97D8F29CA6A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5A765767-0766-433D-B78D-97D8F29CA6A6}.Release|Any CPU.Build.0 = Release|Any CPU
{B2DC89BD-838C-459C-A32A-98F877479988}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B2DC89BD-838C-459C-A32A-98F877479988}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B2DC89BD-838C-459C-A32A-98F877479988}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B2DC89BD-838C-459C-A32A-98F877479988}.Release|Any CPU.Build.0 = Release|Any CPU
{7193BE83-12C1-4B35-8197-C28D20FBA1E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7193BE83-12C1-4B35-8197-C28D20FBA1E6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7193BE83-12C1-4B35-8197-C28D20FBA1E6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7193BE83-12C1-4B35-8197-C28D20FBA1E6}.Release|Any CPU.Build.0 = Release|Any CPU
{51D7507D-48BA-43BB-8223-CE35A2D7D0D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{51D7507D-48BA-43BB-8223-CE35A2D7D0D8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{51D7507D-48BA-43BB-8223-CE35A2D7D0D8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{51D7507D-48BA-43BB-8223-CE35A2D7D0D8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -76,7 +84,8 @@ Global
{B8761D43-B253-49FC-B144-A6CCB061951B} = {752F5AE8-BA08-4C41-B9B2-D2ED12727E63}
{3F5C09C7-81EB-461C-8E0E-538D3FBAB931} = {752F5AE8-BA08-4C41-B9B2-D2ED12727E63}
{5A765767-0766-433D-B78D-97D8F29CA6A6} = {D34F1DE5-ECF7-4CF0-8325-B7A38F41D376}
{B2DC89BD-838C-459C-A32A-98F877479988} = {C60BCE84-4AF4-4393-8D3E-1B69E29549C1}
{7193BE83-12C1-4B35-8197-C28D20FBA1E6} = {DFD13180-D1BF-44DA-BEBE-4A54EFDEFFE2}
{51D7507D-48BA-43BB-8223-CE35A2D7D0D8} = {DFD13180-D1BF-44DA-BEBE-4A54EFDEFFE2}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E124DDCB-1F8D-4F96-BF41-D87019D0A412}
Expand Down
2 changes: 1 addition & 1 deletion components/AntDesign.csproj
Expand Up @@ -54,7 +54,7 @@
<ItemGroup>

<PackageReference Include="Microsoft.AspNetCore.Components.DataAnnotations.Validation" Version="3.2.0-rc1.20223.4" />
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.3.1">
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="5.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
Expand Down
17 changes: 11 additions & 6 deletions components/alert/Alert.razor
Expand Up @@ -4,7 +4,7 @@
@if (!_isClosed)
{
<div data-show="@(!_isClosing||_isClosed?"true":"false")" class="@ClassMapper.Class" style="@_innerStyle @Style " Id="@Id" @ref="Ref">
@if (ShowIcon)
@if (IsShowIcon)
{
@if (Icon != null)
{
Expand All @@ -18,18 +18,23 @@
}
}
<div class="ant-alert-content">
@if (!string.IsNullOrEmpty(Message))
@if (MessageTemplate != null)
{
<div class="ant-alert-message">@Message</div>
<div class="ant-alert-message">@MessageTemplate</div>
}
@if (!string.IsNullOrEmpty(Description))
else if (!string.IsNullOrEmpty(Message))
{
<div class="ant-alert-description">@Description</div>
<div class="ant-alert-message">@Message</div>
}

@if (ChildContent != null)
{
<div class="ant-alert-description">@ChildContent</div>
}
else if (!string.IsNullOrEmpty(Description))
{
<div class="ant-alert-description">@Description</div>
}
</div>
@if (Closable)
{
Expand All @@ -45,4 +50,4 @@
</button>
}
</div>
}
}
37 changes: 22 additions & 15 deletions components/alert/Alert.razor.cs
Expand Up @@ -2,6 +2,7 @@
using AntDesign.JsInterop;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using System.Collections.Generic;

namespace AntDesign
{
Expand Down Expand Up @@ -52,17 +53,20 @@ public partial class Alert : AntDomComponentBase
[Parameter]
public string Message { get; set; }

[Parameter]
public RenderFragment MessageTemplate { get; set; }

/// <summary>
/// Whether to show icon.
/// </summary>
[Parameter]
public bool ShowIcon { get; set; }
public bool? ShowIcon { get; set; }

/// <summary>
/// Type of Alert styles, options: success, info, warning, error
/// </summary>
[Parameter]
public string Type { get; set; } = AlertType.Default;
public string Type { get; set; }

/// <summary>
/// Callback when Alert is closed.
Expand All @@ -79,11 +83,14 @@ public partial class Alert : AntDomComponentBase
/// <summary>
/// Icon to show.
/// </summary>
protected string IconType =>
Type == AlertType.Success ? "check-circle"
: Type == AlertType.Info ? "info-circle"
: Type == AlertType.Warning ? "exclamation-circle"
: Type == AlertType.Error ? "close-circle" : null;
protected string IconType => CalcType switch
{
AlertType.Success => "check-circle",
AlertType.Info => "info-circle",
AlertType.Warning => "exclamation-circle",
AlertType.Error => "close-circle",
_ => "exclamation-circle",
};

/// <summary>
/// Indicator if the component is closed or not.
Expand All @@ -101,22 +108,27 @@ public partial class Alert : AntDomComponentBase

private string _innerStyle = string.Empty;

private bool IsShowIcon => (Banner && ShowIcon == null) ? true : ShowIcon == true;

private string CalcType => Type ?? (Banner ? AlertType.Warning : AlertType.Info);

/// <summary>
/// Sets the default classes.
/// </summary>
private void SetClassMap()
{
string prefixName = "ant-alert";
ClassMapper.Clear()
ClassMapper
.Add("ant-alert")
.If($"{prefixName}-{Type}", () => !string.IsNullOrEmpty(Type))
.If($"{prefixName}-no-icon", () => !ShowIcon)
.GetIf(() => $"{prefixName}-{CalcType}", () => !string.IsNullOrEmpty(CalcType))
.If($"{prefixName}-no-icon", () => !IsShowIcon)
.If($"{prefixName}-closable", () => Closable)
.If($"{prefixName}-banner", () => Banner)
.If($"{prefixName}-with-description", () => !string.IsNullOrEmpty(Description) || ChildContent != null)
.If($"{prefixName}-motion", () => _isClosing)
.If($"{prefixName}-motion-leave", () => _isClosing)
.If($"{prefixName}-motion-leave-active", () => _isClosing && _motionStage == 1)
.If($"{prefixName}-rtl", () => RTL)
;
}

Expand All @@ -127,11 +139,6 @@ protected override void OnInitialized()
{
base.OnInitialized();

if (Banner && string.IsNullOrEmpty(Type) && Icon == null)
{
ShowIcon = false;
}

SetClassMap();
}

Expand Down
2 changes: 1 addition & 1 deletion components/anchor/Anchor.razor
Expand Up @@ -2,7 +2,7 @@
@inherits AntDomComponentBase

<div class="ant-anchor-wrapper" style="max-height: 100vh;" id="@Id" @ref="Ref">
<div class="ant-anchor">
<div class="@ClassMapper.Class">
<div class="ant-anchor-ink" @ref="@_ink">
<span class="@_ballClass" style="@_ballStyle">
</span>
Expand Down
18 changes: 15 additions & 3 deletions components/anchor/Anchor.razor.cs
Expand Up @@ -14,7 +14,7 @@ namespace AntDesign
public partial class Anchor : AntDomComponentBase, IAnchor
{
private string _ballClass = "ant-anchor-ink-ball";
private string _ballStyle = string.Empty;
private string _ballStyle = string.Empty;
private ElementReference _ink;
private DomRect _selfDom;
private AnchorLink _activeLink;
Expand Down Expand Up @@ -112,6 +112,15 @@ public string Key

#endregion Parameters

protected override void OnInitialized()
{
base.OnInitialized();

string prefixCls = "ant-anchor";
ClassMapper.Add(prefixCls)
.If($"{prefixCls}-rtl", () => RTL);
}

protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnAfterRenderAsync(firstRender);
Expand Down Expand Up @@ -226,7 +235,7 @@ private async void OnScroll(JsonElement obj)
string activeKey = _linkTops.Where(p => (int)p.Value <= 0).OrderBy(p => p.Value).LastOrDefault().Key;
if (!string.IsNullOrEmpty(activeKey))
{
_activeLink = _flatLinks.Single(l => l.Href == activeKey);
_activeLink = _flatLinks.FirstOrDefault(l => l.Href == activeKey);
await ActivateAsync(_activeLink, true);
}

Expand All @@ -250,7 +259,10 @@ private async void OnScroll(JsonElement obj)

private async Task ActivateAsync(AnchorLink anchorLink, bool active)
{
anchorLink.Activate(active);
if (anchorLink == null)
return;

anchorLink?.Activate(active);

if (active && _activeLink != _lastActiveLink)
{
Expand Down
3 changes: 3 additions & 0 deletions components/ant-design-blazor.aliyun.less
@@ -0,0 +1,3 @@
@import "./style/aliyun.less";
@import "./style/entry.less";
@import "./components.less";
3 changes: 3 additions & 0 deletions components/ant-design-blazor.compact.less
@@ -0,0 +1,3 @@
@import "./style/compact.less";
@import "./style/entry.less";
@import "./components.less";
3 changes: 3 additions & 0 deletions components/ant-design-blazor.dark.less
@@ -0,0 +1,3 @@
@import "./style/dark.less";
@import "./style/entry.less";
@import "./components.less";
6 changes: 3 additions & 3 deletions components/avatar/AvatarGroup.razor
Expand Up @@ -2,15 +2,15 @@
@inherits AntDomComponentBase

<CascadingValue Value="this" IsFixed="@true">
<div class="ant-avatar-group">
<div class="@ClassMapper.Class">
<CascadingValue Value=@("shown") Name="position">
@ChildContent
</CascadingValue>
@if (_overflow)
{
<Popover Trigger="new[] { TriggerType.Hover}"
<Popover Trigger="new[] { TriggerType.Hover }"
Placement=MaxPopoverPlacement
OverlayClassName=@($"{_prefixCls}-popover")>
OverlayClassName="@_popoverClassMapper.Class">
<ContentTemplate>
<CascadingValue Value=@("hidden") Name="position">
@ChildContent
Expand Down
15 changes: 15 additions & 0 deletions components/avatar/AvatarGroup.razor.cs
Expand Up @@ -17,12 +17,27 @@ public partial class AvatarGroup : AntDomComponentBase
[Parameter]
public PlacementType MaxPopoverPlacement { get; set; } = PlacementType.Top;

private ClassMapper _popoverClassMapper = new ClassMapper();

private bool _overflow;
private string _prefixCls = "ant-avatar-group";

private IList<Avatar> _shownAvatarList = new List<Avatar>();
private IList<Avatar> _hiddenAvatarList = new List<Avatar>();

protected override void OnInitialized()
{
base.OnInitialized();

ClassMapper
.Add(_prefixCls)
.If($"{_prefixCls}-rtl", () => RTL);

_popoverClassMapper
.Add($"{_prefixCls}-popover")
.If($"{_prefixCls}-popover-rtl", () => RTL);
}

internal void AddAvatar(Avatar item)
{
if (item.Position == null)
Expand Down
1 change: 1 addition & 0 deletions components/badge/Badge.razor.cs
Expand Up @@ -145,6 +145,7 @@ private void SetClassMap()
.Add(prefixName)
.If($"{prefixName}-status", () => HasStatusOrColor)
.If($"{prefixName}-not-a-wrapper", () => ChildContent == null)
.If($"{prefixName}-rtl", () => RTL)
;

CountClassMapper.Clear()
Expand Down
4 changes: 1 addition & 3 deletions components/badge/BadgeRibbon.razor.cs
Expand Up @@ -35,7 +35,6 @@ public partial class BadgeRibbon : AntDomComponentBase
[Parameter]
public RenderFragment ChildContent { get; set; }


private string PresetColor => Color.IsIn(_badgePresetColors) ? Color : null;

private string _colorStyle;
Expand All @@ -51,12 +50,11 @@ private void SetClassMap()
ClassMapper.Clear()
.Add(prefixName)
.Add($"{prefixName}-placement-{Placement}")
//.If($"{prefixName}-rtl", () => Direction == "RTL" # Placeholder for when RTL support is added
.If($"{prefixName}-rtl", () => RTL)
.If($"{prefixName}-color-{PresetColor}", () => Color.IsIn(_badgePresetColors))
;
}


private void SetStyle()
{
if (PresetColor == null && !string.IsNullOrWhiteSpace(Color))
Expand Down
6 changes: 5 additions & 1 deletion components/breadcrumb/Breadcrumb.razor.cs
Expand Up @@ -30,7 +30,11 @@ private void Navigate(string url)

protected override void OnInitialized()
{
this.ClassMapper.Add("ant-breadcrumb");
string prefixCls = "ant-breadcrumb";

this.ClassMapper
.Add(prefixCls)
.If($"{prefixCls}-rtl", () => RTL);

base.OnInitialized();
}
Expand Down
5 changes: 3 additions & 2 deletions components/button/Button.razor.cs
Expand Up @@ -89,10 +89,10 @@ public string FormSize

protected void SetClassMap()
{
const string prefixName = "ant-btn";
var prefixName = "ant-btn";

ClassMapper.Clear()
.Add("ant-btn")
.Add(prefixName)
.GetIf(() => $"{prefixName}-{this.Type}", () => !string.IsNullOrEmpty(Type))
.If($"{prefixName}-dangerous", () => Danger)
.GetIf(() => $"{prefixName}-{Shape}", () => !string.IsNullOrEmpty(Shape))
Expand All @@ -103,6 +103,7 @@ protected void SetClassMap()
.If($"{prefixName}-background-ghost", () => Ghost)
.If($"{prefixName}-block", () => this.Block)
.If($"ant-input-search-button", () => this.Search)
.If($"{prefixName}-rtl", () => RTL)
;
}

Expand Down

0 comments on commit e8965eb

Please sign in to comment.