|
22 | 22 | @((MarkupString) property) |
23 | 23 | </ElementTemplate> |
24 | 24 | </Dropdown> |
25 | | - <Dropdown @ref="orderModeDropdown" |
26 | | - ElementType="OrderMode" |
27 | | - @bind-SelectedElement="SelectedOrderMode" |
28 | | - Elements="orderModes" |
29 | | - ElementToString="@(a => a.ToString())"> |
30 | | - <ElementTemplate Context="orderMode"> |
31 | | - @((MarkupString) orderMode.ToString()) |
32 | | - </ElementTemplate> |
33 | | - </Dropdown> |
| 25 | + <button id="toggle-order-mode-button" type="button" class="btn btn-sm" @onclick="OnToggleOrderModeButtonClick"> |
| 26 | + <span class="@DisplayOrderModeButton()"/> |
| 27 | + </button> |
34 | 28 | </div> |
35 | 29 |
|
36 | 30 | @code |
|
39 | 33 | /// List of the properties, that the user can order the collection by. |
40 | 34 | /// </summary> |
41 | 35 | [Parameter, EditorRequired] |
42 | | - public List<string> ElementProperties { get; set; } |
| 36 | + public List<string>? ElementProperties { get; set; } |
43 | 37 | /// <summary> |
44 | 38 | /// Collection of items, that the user can order by the selected property and order mode. |
45 | 39 | /// </summary> |
46 | 40 | [Parameter, EditorRequired] |
47 | | - public List<TCollectionItem> Collection { get; set; } |
| 41 | + public List<TCollectionItem>? Collection { get; set; } |
48 | 42 | /// <summary> |
49 | 43 | /// Callback to communicate that the reordering process has been completed. |
50 | 44 | /// </summary> |
51 | 45 | [Parameter, EditorRequired] |
52 | | - public EventCallback CollectionReordered { get; set; } |
| 46 | + public EventCallback<List<TCollectionItem>> CollectionReordered { get; set; } |
53 | 47 |
|
54 | 48 | /// <summary> |
55 | 49 | /// Backing field of property 'SelectedProperty'. |
|
96 | 90 | /// </summary> |
97 | 91 | private Dropdown<string>? propertyDropdown; |
98 | 92 | /// <summary> |
99 | | - /// Reference to the dropdown component for the order mode. |
100 | | - /// </summary> |
101 | | - private Dropdown<OrderMode>? orderModeDropdown; |
102 | | - /// <summary> |
103 | 93 | /// The visual elements for the implemented order modes. |
104 | 94 | /// </summary> |
105 | 95 | private List<OrderMode> orderModes = new List<OrderMode> {OrderMode.Asc, OrderMode.Desc}; |
| 96 | + /// <summary> |
| 97 | + /// Flag to check whether the component was initialized successfully. |
| 98 | + /// </summary> |
| 99 | + private bool initialized = false; |
106 | 100 |
|
107 | | - protected override void OnAfterRender(bool firstRender) |
| 101 | + protected override void OnParametersSet() |
108 | 102 | { |
109 | | - if (firstRender) |
| 103 | + if (!initialized && ElementProperties != null && ElementProperties.Any()) |
110 | 104 | { |
111 | | - if(propertyDropdown != null) |
112 | | - { |
113 | | - //selectedOrderMode = OrderMode.Asc; // TODO: admissiable because of l. 74? |
114 | | - selectedProperty = propertyDropdown.Elements.First(); |
115 | | - } |
116 | | - |
117 | | - StateHasChanged(); |
| 105 | + SelectedProperty = ElementProperties.First(); |
| 106 | + initialized = true; |
118 | 107 | } |
119 | 108 | } |
120 | 109 |
|
|
123 | 112 | /// </summary> |
124 | 113 | private void ReorderCollection() |
125 | 114 | { |
126 | | - if(SelectedProperty.Equals("Ip") && typeof(TCollectionItem) == typeof(ModellingAppServer)) |
| 115 | + if(Collection != null && !string.IsNullOrEmpty(SelectedProperty)) |
127 | 116 | { |
128 | | - Collection = Collection.OrderBy(GetIPAddressRange, new IPAddressRangeComparer()).ToList<TCollectionItem>(); |
| 117 | + if(SelectedProperty.Equals("Ip") && typeof(TCollectionItem) == typeof(ModellingAppServer)) |
| 118 | + { |
| 119 | + Collection = Collection.OrderBy(GetIPAddressRange, new IPAddressRangeComparer()).ToList<TCollectionItem>(); |
| 120 | + } |
| 121 | + else |
| 122 | + { |
| 123 | + Func<TCollectionItem, object> keySelector = GetGenericOrderByExpression<TCollectionItem>(SelectedProperty); |
| 124 | + Collection = Collection.OrderBy(keySelector).ToList(); |
| 125 | + } |
| 126 | + |
| 127 | + if (SelectedOrderMode == OrderMode.Desc) |
| 128 | + { |
| 129 | + Collection.Reverse(); |
| 130 | + } |
| 131 | + |
| 132 | + if (initialized) |
| 133 | + { |
| 134 | + InvokeAsync(StateHasChanged); |
| 135 | + |
| 136 | + } |
| 137 | + |
| 138 | + CollectionReordered.InvokeAsync(Collection); |
129 | 139 | } |
130 | 140 | else |
131 | 141 | { |
132 | | - Func<TCollectionItem, object> keySelector = GetGenericOrderByExpression<TCollectionItem>(propertyDropdown.SelectedElement); |
133 | | - Collection = Collection.OrderBy(keySelector).ToList(); |
| 142 | + throw new NullReferenceException(); |
134 | 143 | } |
135 | | - |
136 | | - if (SelectedOrderMode == OrderMode.Desc) |
137 | | - { |
138 | | - Collection.Reverse(); |
139 | | - } |
140 | | - |
141 | | - InvokeAsync(StateHasChanged); |
142 | | - CollectionReordered.InvokeAsync(); |
143 | 144 | } |
144 | 145 |
|
145 | 146 | /// <summary> |
|
166 | 167 | private Func<T, object> GetGenericOrderByExpression<T>(string propertyName) |
167 | 168 | { |
168 | 169 | ParameterExpression param = Expression.Parameter(typeof(T), "x"); |
169 | | - PropertyInfo propertyInfo = typeof(T).GetProperty(propertyName); |
| 170 | + |
| 171 | + if (string.IsNullOrWhiteSpace(propertyName)) |
| 172 | + { |
| 173 | + throw new ArgumentException(); |
| 174 | + } |
| 175 | + |
| 176 | + PropertyInfo? propertyInfo = typeof(T).GetProperty(propertyName); |
170 | 177 |
|
171 | 178 | if (propertyInfo == null) |
172 | 179 | { |
|
178 | 185 |
|
179 | 186 | return Expression.Lambda<Func<T, object>>(converted, param).Compile(); |
180 | 187 | } |
| 188 | + |
| 189 | + /// <summary> |
| 190 | + /// Displays icon of selected order mode. |
| 191 | + /// </summary> |
| 192 | + private string DisplayOrderModeButton() |
| 193 | + { |
| 194 | + switch (SelectedOrderMode) |
| 195 | + { |
| 196 | + case (OrderMode.Asc): |
| 197 | + return Icons.OrderByAsc; |
| 198 | + |
| 199 | + case (OrderMode.Desc): |
| 200 | + return Icons.OrderByDesc; |
| 201 | + |
| 202 | + default: |
| 203 | + throw new NotImplementedException(); |
| 204 | + } |
| 205 | + } |
| 206 | + |
| 207 | + /// <summary> |
| 208 | + /// Handles the click event of the 'toggle-order-mode-button' |
| 209 | + /// </summary> |
| 210 | + private void OnToggleOrderModeButtonClick() |
| 211 | + { |
| 212 | + switch (SelectedOrderMode) |
| 213 | + { |
| 214 | + case (OrderMode.Asc): |
| 215 | + SelectedOrderMode = OrderMode.Desc; |
| 216 | + break; |
| 217 | + |
| 218 | + case (OrderMode.Desc): |
| 219 | + SelectedOrderMode = OrderMode.Asc; |
| 220 | + break; |
| 221 | + |
| 222 | + default: |
| 223 | + throw new NotImplementedException(); |
| 224 | + } |
| 225 | + } |
181 | 226 | } |
0 commit comments