Skip to content

Commit c3489b9

Browse files
Merge branch 'develop' into puppeteer
2 parents f4ea349 + a68df7e commit c3489b9

File tree

5 files changed

+97
-90
lines changed

5 files changed

+97
-90
lines changed

roles/lib/files/FWO.Api.Client/Data/Icons.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public struct Icons
2929
public const string CollapseLeft = "oi oi-collapse-left";
3030
public const string CollapseRight = "oi oi-collapse-right";
3131
public const string Share = "oi oi-fork"; // oi-share-boxed? oi-share?
32+
public const string OrderByAsc = "oi oi-caret-top";
33+
public const string OrderByDesc = "oi oi-caret-bottom";
3234

3335
// Object types: General
3436
public const string Ldap = "oi oi-key";

roles/lib/files/FWO.Basics/IpOperations.cs

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -217,54 +217,6 @@ public static int CompareIpValues(IPAddress ip1, IPAddress ip2)
217217
return 0;
218218
}
219219

220-
/// <summary>
221-
/// Compares to strings that may contain subnet masks by their format and value.
222-
/// </summary>
223-
public static int CompareSubnetMasks(string subnetMask1, string subnetMask2)
224-
{
225-
if (subnetMask1.StartsWith(@"\")) subnetMask1 = subnetMask1.Substring(1);
226-
if (subnetMask2.StartsWith(@"\")) subnetMask2 = subnetMask2.Substring(1);
227-
228-
if(subnetMask1 != subnetMask2)
229-
{
230-
// first without subnet masks
231-
if (subnetMask1 == "") return -1;
232-
if (subnetMask2 == "") return 1;
233-
234-
// then cidr
235-
int subnet1CIDR;
236-
int subnet2CIDR;
237-
bool subnet1IsInt = int.TryParse(subnetMask1, out subnet1CIDR);
238-
bool subnet2IsInt = int.TryParse(subnetMask2, out subnet2CIDR);
239-
if (subnet1IsInt && subnet2IsInt)
240-
{
241-
if (subnet1CIDR < subnet2CIDR) return -1;
242-
if (subnet1CIDR > subnet2CIDR) return 1;
243-
}
244-
if (subnet1IsInt) return -1;
245-
if (subnet2IsInt) return 1;
246-
247-
248-
IPAddress subnet1IP;
249-
IPAddress subnet2IP;
250-
bool subnet1IsIp = IPAddress.TryParse(subnetMask1, out subnet1IP);
251-
bool subnet2IsIp = IPAddress.TryParse(subnetMask2, out subnet2IP);
252-
if (subnet1IsIp && subnet2IsIp)
253-
{
254-
// if both in ip format order by value
255-
int compareIpValuesResult = CompareIpValues(subnet1IP, subnet2IP);
256-
if (compareIpValuesResult != 0) return compareIpValuesResult;
257-
}
258-
259-
// if one is ip format it should come before the unhandled case
260-
if (subnet1IsIp) return -1;
261-
if (subnet2IsIp) return 1;
262-
}
263-
264-
// if nothing fits just treat as they were the same
265-
return 0;
266-
}
267-
268220
/// <summary>
269221
/// Compares two IPAdress objects by their family (IPv4 or IPv6).
270222
/// </summary>

roles/ui/files/FWO.UI/Pages/NetworkModelling/EditAppRole.razor

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,9 +318,13 @@
318318
/// <summary>
319319
/// Updates the app server's visual elements after reordering the collection.
320320
/// </summary>
321-
private void OnCollectionReordered()
321+
private void OnCollectionReordered(List<ModellingAppServer> orderedCollection)
322322
{
323-
AppRoleHandler.AppServerToAdd = orderByDropdown.Collection;
323+
if (AppRoleHandler != null && orderedCollection != null)
324+
{
325+
AppRoleHandler.AppServerToAdd = orderedCollection;
326+
}
327+
324328
InvokeAsync(StateHasChanged);
325329
}
326330
}

roles/ui/files/FWO.UI/Pages/NetworkModelling/EditAppRoleLeftSide.razor

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,13 @@
8585
/// <summary>
8686
/// Updates the app server's visual elements after reordering the collection.
8787
/// </summary>
88-
private void OnCollectionReordered()
88+
private void OnCollectionReordered(List<ModellingAppServer> orderedCollection)
8989
{
90-
AppRoleHandler.AppServersInArea = orderByDropdown.Collection;
90+
if (AppRoleHandler != null && orderedCollection != null)
91+
{
92+
AppRoleHandler.AppServersInArea = orderedCollection;
93+
}
94+
9195
InvokeAsync(StateHasChanged);
9296
}
9397
}

roles/ui/files/FWO.UI/Shared/OrderByDropdown.razor

Lines changed: 83 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,9 @@
2222
@((MarkupString) property)
2323
</ElementTemplate>
2424
</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>
3428
</div>
3529

3630
@code
@@ -39,17 +33,17 @@
3933
/// List of the properties, that the user can order the collection by.
4034
/// </summary>
4135
[Parameter, EditorRequired]
42-
public List<string> ElementProperties { get; set; }
36+
public List<string>? ElementProperties { get; set; }
4337
/// <summary>
4438
/// Collection of items, that the user can order by the selected property and order mode.
4539
/// </summary>
4640
[Parameter, EditorRequired]
47-
public List<TCollectionItem> Collection { get; set; }
41+
public List<TCollectionItem>? Collection { get; set; }
4842
/// <summary>
4943
/// Callback to communicate that the reordering process has been completed.
5044
/// </summary>
5145
[Parameter, EditorRequired]
52-
public EventCallback CollectionReordered { get; set; }
46+
public EventCallback<List<TCollectionItem>> CollectionReordered { get; set; }
5347

5448
/// <summary>
5549
/// Backing field of property 'SelectedProperty'.
@@ -96,25 +90,20 @@
9690
/// </summary>
9791
private Dropdown<string>? propertyDropdown;
9892
/// <summary>
99-
/// Reference to the dropdown component for the order mode.
100-
/// </summary>
101-
private Dropdown<OrderMode>? orderModeDropdown;
102-
/// <summary>
10393
/// The visual elements for the implemented order modes.
10494
/// </summary>
10595
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;
106100

107-
protected override void OnAfterRender(bool firstRender)
101+
protected override void OnParametersSet()
108102
{
109-
if (firstRender)
103+
if (!initialized && ElementProperties != null && ElementProperties.Any())
110104
{
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;
118107
}
119108
}
120109

@@ -123,23 +112,35 @@
123112
/// </summary>
124113
private void ReorderCollection()
125114
{
126-
if(SelectedProperty.Equals("Ip") && typeof(TCollectionItem) == typeof(ModellingAppServer))
115+
if(Collection != null && !string.IsNullOrEmpty(SelectedProperty))
127116
{
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);
129139
}
130140
else
131141
{
132-
Func<TCollectionItem, object> keySelector = GetGenericOrderByExpression<TCollectionItem>(propertyDropdown.SelectedElement);
133-
Collection = Collection.OrderBy(keySelector).ToList();
142+
throw new NullReferenceException();
134143
}
135-
136-
if (SelectedOrderMode == OrderMode.Desc)
137-
{
138-
Collection.Reverse();
139-
}
140-
141-
InvokeAsync(StateHasChanged);
142-
CollectionReordered.InvokeAsync();
143144
}
144145

145146
/// <summary>
@@ -166,7 +167,13 @@
166167
private Func<T, object> GetGenericOrderByExpression<T>(string propertyName)
167168
{
168169
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);
170177

171178
if (propertyInfo == null)
172179
{
@@ -178,4 +185,42 @@
178185

179186
return Expression.Lambda<Func<T, object>>(converted, param).Compile();
180187
}
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+
}
181226
}

0 commit comments

Comments
 (0)