Skip to content
This repository was archived by the owner on Jan 5, 2024. It is now read-only.

Commit 4460666

Browse files
authored
[新增]TInputRange 组件 (#162)
2 parents efaf0a2 + c34c4db commit 4460666

5 files changed

Lines changed: 197 additions & 2 deletions

File tree

doc/TDesign.Docs.Shared/Layouts/NavMenu.razor

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@
2727
<TMenuItem Link="components/checkbox">Checkbox 多选框</TMenuItem>
2828
<TMenuItem Link="components/input">Input 输入框</TMenuItem>
2929
<TMenuItem Link="components/inputadornment">InputAdornment 输入装饰器</TMenuItem>
30+
<TMenuItem Link="components/inputnumber">InputNumber 数字输入框</TMenuItem>
3031
<TMenuItem Link="components/radio">InputRadio 单选框</TMenuItem>
32+
<TMenuItem Link="components/inputrange">RangeInput 范围输入框</TMenuItem>
3133
<TMenuItem Link="components/switch">Switch 开关</TMenuItem>
3234
<TMenuItem Link="components/textarea">Textarea 多行文本框</TMenuItem>
33-
<TMenuItem Link="components/inputnumber">InputNumber 数字输入框</TMenuItem>
3435
</TMenuItemGroup>
3536
<TMenuItemGroup Title="数据展示">
3637
<TMenuItem Link="components/avatar">Avatar 头像</TMenuItem>
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
@page "/components/inputrange"
2+
3+
<PageHeader Title="InputRange 范围输入框">
4+
用于输入范围文本。
5+
</PageHeader>
6+
7+
<TAlert Theme="Theme.Primary">
8+
为了使组件命名标准化,输入组件以 <code>Input</code> 开头,因此该组件的命名规范将与官方不同。
9+
</TAlert>
10+
<Example Title="基础范围输入框">
11+
<Description>
12+
13+
</Description>
14+
<RunContent>
15+
<TInputRange @bind-StartValue="Start" @bind-EndValue="End" />
16+
</RunContent>
17+
<CodeContent>
18+
@Code.Create(@"
19+
```html
20+
<TInputRange bind-StartValue=""Start"" bind-EndValue=""End"" />
21+
```
22+
```cs
23+
@code{
24+
string Start{ get;set; }
25+
string End{ get;set; }
26+
}
27+
```
28+
")
29+
</CodeContent>
30+
</Example>
31+
32+
@code{
33+
string Start{ get;set; }
34+
string End{ get;set; }
35+
}
36+
37+
38+
<Example Title="不同尺寸的标签输入框">
39+
<Description>
40+
提供大、中(默认)、小三种不同尺寸的的标签输入框。
41+
</Description>
42+
<RunContent>
43+
<TInputRange @bind-StartValue="Start" @bind-EndValue="End" Size="Size.Small" />
44+
<br />
45+
<TInputRange @bind-StartValue="Start" @bind-EndValue="End" Size="Size.Medium" />
46+
<br />
47+
<TInputRange @bind-StartValue="Start" @bind-EndValue="End" Size="Size.Large" />
48+
</RunContent>
49+
<CodeContent>
50+
@Code.Create(@"
51+
```html
52+
<TInputRange bind-StartValue=""Start"" bind-EndValue=""End"" Size=""Size.Small"" />
53+
<TInputRange bind-StartValue=""Start"" bind-EndValue=""End"" Size=""Size.Medium"" />
54+
<TInputRange bind-StartValue=""Start"" bind-EndValue=""End"" Size=""Size.Large"" />
55+
```
56+
```cs
57+
@code{
58+
string Start{ get;set; }
59+
string End{ get;set; }
60+
}
61+
```
62+
")
63+
</CodeContent>
64+
</Example>
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
namespace TDesign.Test.Components;
2+
public class InputRangeTest : TestBase<TInputRange<string>>
3+
{
4+
[Fact(DisplayName = "InputRange - 渲染 css")]
5+
public void Test_Render()
6+
{
7+
var component = GetComponent(m =>
8+
m.Bind(p => p.StartValue, "10", value => { })
9+
.Bind(p => p.EndValue, "50", value => { })
10+
);
11+
component.Should().HaveClass("t-range-input");
12+
13+
component.Find(".t-range-input__inner");
14+
component.Find(".t-range-input__inner-left");
15+
component.Find(".t-range-input__inner-right");
16+
}
17+
18+
[Fact(DisplayName = "InputRange - 尺寸")]
19+
public void Test_Size()
20+
{
21+
var component = GetComponent(m =>
22+
m.Bind(p => p.StartValue, "10", value => { })
23+
.Bind(p => p.EndValue, "50", value => { })
24+
.Add(p => p.Size, Size.Small)
25+
);
26+
component.Should().HaveClass("t-size-s");
27+
}
28+
}

src/TDesign/Components/Forms/TDesignInputComonentBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ protected virtual void BuildInputWrapper(RenderTreeBuilder builder, int sequence
6565
}, TipContent is not null);
6666
}, new
6767
{
68-
@class = HtmlHelper.CreateCssBuilder().Append("t-input__wrap")
68+
@class = HtmlHelper.CreateCssBuilder().Append("t-input__wrap").Append(AdditionalCssClass)
6969
});
7070
}
7171

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
using System.Linq.Expressions;
2+
3+
using Microsoft.AspNetCore.Components.Rendering;
4+
5+
namespace TDesign;
6+
/// <summary>
7+
/// 范围输入框,用于输入范围文本。
8+
/// </summary>
9+
/// <typeparam name="TValue">值的类型。</typeparam>
10+
[CssClass("t-range-input")]
11+
public class TInputRange<TValue> : BlazorComponentBase
12+
{
13+
14+
/// <summary>
15+
/// 设置开始值。
16+
/// </summary>
17+
[Parameter] public TValue? StartValue { get; set; }
18+
19+
/// <summary>
20+
/// 设置开始值的表达式。
21+
/// </summary>
22+
[Parameter] public Expression<Func<TValue?>>? StartValueExpression { get; set; }
23+
24+
/// <summary>
25+
/// 设置开始值变化触发的回调。
26+
/// </summary>
27+
[Parameter] public EventCallback<TValue?> StartValueChanged { get; set; }
28+
29+
30+
/// <summary>
31+
/// 设置结束值。
32+
/// </summary>
33+
[Parameter] public TValue? EndValue { get; set; }
34+
35+
/// <summary>
36+
/// 设置结束值的表达式。
37+
/// </summary>
38+
[Parameter] public Expression<Func<TValue?>>? EndValueExpression { get; set; }
39+
40+
/// <summary>
41+
/// 设置结束值变化触发的回调。
42+
/// </summary>
43+
[Parameter] public EventCallback<TValue?> EndValueChanged { get; set; }
44+
45+
/// <summary>
46+
/// 设置大小。
47+
/// </summary>
48+
[Parameter][CssClass] public Size Size { get; set; } = Size.Medium;
49+
50+
51+
/// <summary>
52+
/// 设置分隔符文本。
53+
/// </summary>
54+
[Parameter] public string Seperator { get; set; } = "-";
55+
56+
57+
/// <inheritdoc/>
58+
protected override void AddContent(RenderTreeBuilder builder, int sequence)
59+
{
60+
builder.CreateElement(sequence, "div", inner =>
61+
{
62+
BuildRangeInput(inner, 0, true, StartValue, StartValueExpression, StartValueChanged);
63+
BuildRnageSeperator(inner, 1);
64+
BuildRangeInput(inner, 3, false, EndValue, EndValueExpression, EndValueChanged);
65+
},
66+
new
67+
{
68+
@class = "t-range-input__inner"
69+
});
70+
}
71+
72+
/// <summary>
73+
/// 构建分隔符。
74+
/// </summary>
75+
/// <param name="builder">The <see cref="RenderTreeBuilder"/> instance.</param>
76+
/// <param name="sequence">一个整数,表示该指令在源代码中的位置。</param>
77+
void BuildRnageSeperator(RenderTreeBuilder builder, int sequence)
78+
{
79+
builder.CreateElement(sequence, "div", Seperator, new { @class = "t-range-input__inner-separator" });
80+
}
81+
82+
/// <summary>
83+
/// 构建输入框。
84+
/// </summary>
85+
/// <param name="builder">The <see cref="RenderTreeBuilder"/> instance.</param>
86+
/// <param name="sequence">一个整数,表示该指令在源代码中的位置。</param>
87+
/// <param name="leftOrRight"><c>true</c>是左边,否则为右边。</param>
88+
/// <param name="value">值</param>
89+
/// <param name="expression">值的表达式</param>
90+
/// <param name="changed">改变事件。</param>
91+
void BuildRangeInput(RenderTreeBuilder builder, int sequence, bool leftOrRight, TValue? value, Expression<Func<TValue?>>? expression, EventCallback<TValue?> changed)
92+
{
93+
builder.CreateComponent<TInputText<TValue>>(0, attributes: new
94+
{
95+
Value = value,
96+
ValueExpression = expression,
97+
ValueChanged = changed,
98+
Size,
99+
AdditionalCssClass = $"t-range-input__inner-{(leftOrRight ? "left" : "right")}"
100+
});
101+
}
102+
}

0 commit comments

Comments
 (0)