-
Notifications
You must be signed in to change notification settings - Fork 1
/
ChoiceListMap.cs
84 lines (70 loc) · 2.31 KB
/
ChoiceListMap.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using FluentWebControls.Interfaces;
namespace FluentWebControls.Mapping
{
public class ChoiceListMap<TDomain, TModel, TItemType> : IChoiceListMap, IFreeTextMap
where TDomain : class, new()
{
private readonly Func<TItemType, string> _getItemText;
private readonly Func<TItemType, string> _getItemValue;
private readonly List<string> _selectedValues = new List<string>();
private Func<IEnumerable<TItemType>> _getListItems;
private IEnumerable<KeyValuePair<string, string>> _listItems;
public ChoiceListMap(string id,
Func<TItemType, string> getItemText,
Func<TItemType, string> getItemValue)
{
_getItemText = getItemText;
_getItemValue = getItemValue;
Id = id;
}
public ChoiceListMap(string id,
TItemType selectedItem,
Func<TItemType, string> getItemText,
Func<TItemType, string> getItemValue)
: this(id, getItemText, getItemValue)
{
_selectedValues.Add(getItemValue(selectedItem));
}
public IEnumerable<string> SelectedValues
{
get { return _selectedValues; }
}
public string Id { get; private set; }
public IEnumerable<KeyValuePair<string, string>> ListItems
{
get { return _listItems ?? (_listItems = _getListItems().Select(x => new KeyValuePair<string, string>(_getItemText(x), _getItemValue(x)))); }
}
public string SelectedValue
{
get { return _selectedValues.FirstOrDefault(); }
}
public IPropertyMetaData Validation { get; set; }
string IFreeTextMap.Value
{
get { return SelectedValue; }
}
public ChoiceListMap<TDomain, TModel, TItemType> WithItems(Func<IEnumerable<TItemType>> getListItems)
{
_getListItems = getListItems;
return this;
}
public ChoiceListMap<TDomain, TModel, TItemType> WithSelectedItems(IEnumerable<TItemType> selectedItems)
{
_selectedValues.AddRange(selectedItems.Select(x => _getItemValue(x)));
return this;
}
public ChoiceListMap<TDomain, TModel, TItemType> WithValidation(Expression<Func<TDomain, TItemType>> getProperty)
{
Validation = Configuration.ValidationMetaDataFactory.GetFor(getProperty);
return this;
}
object IModelMap.GetValueForModel()
{
return SelectedValue;
}
}
}