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