ant-design-blazor/components/timeline/Timeline.razor.cs

118 lines
3.2 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
2019-12-20 00:20:53 +08:00
using System.Linq;
using Microsoft.AspNetCore.Components;
namespace AntDesign
2019-12-20 00:20:53 +08:00
{
public partial class Timeline : AntDomComponentBase
2019-12-20 00:20:53 +08:00
{
/// <summary>
/// 'left' | 'alternate' | 'right'
/// </summary>
[Parameter]
public string Mode { get; set; }
2019-12-20 00:20:53 +08:00
[Parameter]
public bool Reverse { get; set; }
2019-12-20 00:20:53 +08:00
[Parameter]
public RenderFragment Pending { get; set; }
protected virtual RenderFragment LoadingDot { get; }
private TimelineItem PendingItem
2019-12-20 00:20:53 +08:00
{
get
{
if (this.Pending == null) return null;
var item = new TimelineItem(
2020-04-24 18:32:50 +08:00
childContent: !_isPendingBoolean ? Pending : null,
dot: PendingDot ?? LoadingDot,
@class: "ant-timeline-item-pending"
);
2019-12-20 00:20:53 +08:00
item.SetClassMap();
2019-12-20 00:20:53 +08:00
return item;
}
}
[Parameter]
public RenderFragment PendingDot { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
private IList<TimelineItem> _items = new List<TimelineItem>();
2019-12-20 00:20:53 +08:00
protected IList<TimelineItem> DisplayItems
2019-12-20 00:20:53 +08:00
{
get
{
var pitems = PendingItem != null ? new[] { PendingItem } : Array.Empty<TimelineItem>();
if (Reverse)
2019-12-20 00:20:53 +08:00
{
return pitems.Concat(UpdateChildren(_items.Reverse())).ToList();
2019-12-20 00:20:53 +08:00
}
else
{
return UpdateChildren(_items).Concat(pitems).ToList();
2019-12-20 00:20:53 +08:00
}
}
}
2020-04-24 18:32:50 +08:00
private readonly bool _isPendingBoolean = false;
2019-12-20 00:20:53 +08:00
protected override void OnInitialized()
{
SetClassMap();
2019-12-20 00:20:53 +08:00
base.OnInitialized();
}
protected override void OnParametersSet()
{
SetClassMap();
2019-12-20 00:20:53 +08:00
base.OnParametersSet();
}
protected void SetClassMap()
2019-12-20 00:20:53 +08:00
{
var prefix = "ant-timeline";
ClassMapper.Clear()
.Add(prefix)
.If($"{prefix}-right", () => Mode == "right")
.If($"{prefix}-alternate", () => Mode == "alternate")
2019-12-20 00:20:53 +08:00
.If($"{prefix}-pending", () => Pending != null)
.If($"{prefix}-reverse", () => Reverse);
2019-12-20 00:20:53 +08:00
}
internal void AddItem(TimelineItem item)
2019-12-20 00:20:53 +08:00
{
this._items.Add(item);
2019-12-20 00:20:53 +08:00
StateHasChanged();
}
protected IEnumerable<TimelineItem> UpdateChildren(IEnumerable<TimelineItem> items)
2019-12-20 00:20:53 +08:00
{
if (!items.Any())
yield break;
var length = items.Count();
for (int i = 0; i < length; i++)
{
var item = items.ElementAt(i);
item.IsLast = i == length - 1;
item.Position =
this.Mode == "left" || Mode == null ? null
: this.Mode == "right" ? "right"
: this.Mode == "alternate" && i % 2 == 0 ? "left"
2019-12-20 00:20:53 +08:00
: "right";
item.SetClassMap();
2019-12-20 00:20:53 +08:00
yield return item;
}
}
}
}