namespace JiDangJia.Views;
public sealed class SearchChoiceInput : ContentView
{
private readonly Dictionary<string,string> options;
private readonly Button button;
private readonly string title;
public string Value {get;private set;}
public event Action? Changed;
public SearchChoiceInput(string title,Dictionary<string,string> options,string value)
{
this.title=title;this.options=options;Value=value;
button=Ui.Button("",async()=>
{
var navigation=Application.Current!.Windows[0].Page!.Navigation;
await navigation.PushAsync(new SelectionPage(title,options,Value,SetValue));
},false);
button.FontAttributes=FontAttributes.None;button.FontSize=14;Content=button;Refresh();
}
public void SetValue(string value) {Value=value;Refresh();Changed?.Invoke();}
public void Refresh() => button.Text=options.GetValueOrDefault(Value,"点击搜索并选择客户")+" ⌕";
}
public sealed class SelectionPage : ContentPage
{
private readonly Entry search=new(){Placeholder="搜索姓名 / 电话 / 客户编号",ClearButtonVisibility=ClearButtonVisibility.WhileEditing,ReturnType=ReturnType.Search};
private readonly VerticalStackLayout list=Ui.Stack();
private readonly Dictionary<string,string> options;
private readonly string selected;
private readonly Action<string> choose;
private readonly bool inventory;
private int limit=50;
public SelectionPage(string title,Dictionary<string,string> options,string selected,Action<string> choose,bool inventory=false)
{
Title=title;this.options=options;this.selected=selected;this.choose=choose;this.inventory=inventory;
if(inventory)search.Placeholder="搜索物品名称 / 编码 / 序列号";
var body=Ui.Stack(Ui.Card(search,12,new Thickness(12,0),Ui.Paper),list);body.Padding=18;Content=new ScrollView{Content=body};
search.TextChanged+=(_,_)=>{limit=50;Load();};Load();
}
private void Load()
{
list.Clear();var query=(search.Text??"").Trim();
var rows=options.Where(p=>query.Length==0||p.Value.Contains(query,StringComparison.OrdinalIgnoreCase)).ToList();
list.Add(Ui.Text(rows.Count+(inventory?" 件可出租物品":" 位客户 / 供应商"),12,Ui.Muted));
foreach(var pair in rows.Take(limit))
{
var key=pair.Key;var text=Ui.Text(pair.Value,14);text.LineBreakMode=LineBreakMode.WordWrap;
list.Add(Ui.Tap(Ui.Card(Ui.Spread(text,Ui.Text(key==selected?"✓":"选择",12,Ui.Bronze))),async()=>{choose(key);await Navigation.PopAsync();},(inventory?"选择物品 ":"选择客户 ")+pair.Value));
}
if(rows.Count==0)list.Add(Ui.Empty(inventory?"未找到物品":"未找到客户",inventory?"试试其他名称、编码或序列号":"试试其他姓名、电话或客户编号"));
if(rows.Count>limit)list.Add(Ui.Button("加载更多",()=>{limit+=50;Load();return Task.CompletedTask;},false));
}
}
namespace JiDangJia.Views;
public sealed class SearchChoiceInput : ContentView
{
private readonly Dictionary<string,string> options;
private readonly Button button;
private readonly string title;
public string Value {get;private set;}
public event Action? Changed;
public SearchChoiceInput(string title,Dictionary<string,string> options,string value)
{
this.title=title;this.options=options;Value=value;
button=Ui.Button("",async()=>
{
var navigation=Application.Current!.Windows[0].Page!.Navigation;
await navigation.PushAsync(new SelectionPage(title,options,Value,SetValue));
},false);
button.FontAttributes=FontAttributes.None;button.FontSize=14;Content=button;Refresh();
}
public void SetValue(string value) {Value=value;Refresh();Changed?.Invoke();}
public void Refresh() => button.Text=options.GetValueOrDefault(Value,"点击搜索并选择客户")+" ⌕";
}
public sealed class SelectionPage : ContentPage
{
private readonly Entry search=new(){Placeholder="搜索姓名 / 电话 / 客户编号",ClearButtonVisibility=ClearButtonVisibility.WhileEditing,ReturnType=ReturnType.Search};
private readonly VerticalStackLayout list=Ui.Stack();
private readonly Dictionary<string,string> options;
private readonly string selected;
private readonly Action<string> choose;
private readonly bool inventory;
private int limit=50;
public SelectionPage(string title,Dictionary<string,string> options,string selected,Action<string> choose,bool inventory=false)
{
Title=title;this.options=options;this.selected=selected;this.choose=choose;this.inventory=inventory;
if(inventory)search.Placeholder="搜索物品名称 / 编码 / 序列号";
var body=Ui.Stack(Ui.Card(search,12,new Thickness(12,0),Ui.Paper),list);body.Padding=18;Content=new ScrollView{Content=body};
search.TextChanged+=(_,_)=>{limit=50;Load();};Load();
}
private void Load()
{
list.Clear();var query=(search.Text??"").Trim();
var rows=options.Where(p=>query.Length==0||p.Value.Contains(query,StringComparison.OrdinalIgnoreCase)).ToList();
list.Add(Ui.Text(rows.Count+(inventory?" 件可出租物品":" 位客户 / 供应商"),12,Ui.Muted));
foreach(var pair in rows.Take(limit))
{
var key=pair.Key;var text=Ui.Text(pair.Value,14);text.LineBreakMode=LineBreakMode.WordWrap;
list.Add(Ui.Tap(Ui.Card(Ui.Spread(text,Ui.Text(key==selected?"✓":"选择",12,Ui.Bronze))),async()=>{choose(key);await Navigation.PopAsync();},(inventory?"选择物品 ":"选择客户 ")+pair.Value));
}
if(rows.Count==0)list.Add(Ui.Empty(inventory?"未找到物品":"未找到客户",inventory?"试试其他名称、编码或序列号":"试试其他姓名、电话或客户编号"));
if(rows.Count>limit)list.Add(Ui.Button("加载更多",()=>{limit+=50;Load();return Task.CompletedTask;},false));
}
}