aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2018-03-11 14:03:02 +0200
committerRoy Ben-Shabat <Roy@Twine-s.com>2018-03-11 14:03:02 +0200
commitc923d6611ffa64605879779c490a979e03daa189 (patch)
tree8fedfe9963847146018c18ceee9cce7e0d0d579e /Software
parent4188ea39897f5aa3bc4be5a44358b79436baf0b4 (diff)
downloadTango-c923d6611ffa64605879779c490a979e03daa189.tar.gz
Tango-c923d6611ffa64605879779c490a979e03daa189.zip
Working on Users & Roles module !
Diffstat (limited to 'Software')
-rw-r--r--Software/DB/Change Scripts/Cascade Machine Delete To Configuration.sqlbin0 -> 2824 bytes
-rw-r--r--Software/DB/Change Scripts/Cascade User Delete To Contact and Address.sqlbin0 -> 3816 bytes
-rw-r--r--Software/DB/Tango.mdfbin75497472 -> 75497472 bytes
-rw-r--r--Software/DB/Tango_log.ldfbin1048576 -> 1048576 bytes
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/ViewModels/MainViewVM.cs61
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/Views/UserManagementView.xaml103
-rw-r--r--Software/Visual_Studio/Tango.BL/EntitiesExtensions/Contact.cs16
-rw-r--r--Software/Visual_Studio/Tango.BL/IObservableEntity.cs5
-rw-r--r--Software/Visual_Studio/Tango.BL/ObservableEntity.cs17
-rw-r--r--Software/Visual_Studio/Tango.BL/Tango.BL.csproj1
-rw-r--r--Software/Visual_Studio/Tango.Core/ExtensionMethods/StringExtensions.cs22
11 files changed, 201 insertions, 24 deletions
diff --git a/Software/DB/Change Scripts/Cascade Machine Delete To Configuration.sql b/Software/DB/Change Scripts/Cascade Machine Delete To Configuration.sql
new file mode 100644
index 000000000..a0a38b6dc
--- /dev/null
+++ b/Software/DB/Change Scripts/Cascade Machine Delete To Configuration.sql
Binary files differ
diff --git a/Software/DB/Change Scripts/Cascade User Delete To Contact and Address.sql b/Software/DB/Change Scripts/Cascade User Delete To Contact and Address.sql
new file mode 100644
index 000000000..052655968
--- /dev/null
+++ b/Software/DB/Change Scripts/Cascade User Delete To Contact and Address.sql
Binary files differ
diff --git a/Software/DB/Tango.mdf b/Software/DB/Tango.mdf
index 598a7c37e..cb00adf1a 100644
--- a/Software/DB/Tango.mdf
+++ b/Software/DB/Tango.mdf
Binary files differ
diff --git a/Software/DB/Tango_log.ldf b/Software/DB/Tango_log.ldf
index 1411d7c4e..972799de3 100644
--- a/Software/DB/Tango_log.ldf
+++ b/Software/DB/Tango_log.ldf
Binary files differ
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/ViewModels/MainViewVM.cs
index fdb0f8983..9478014b7 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/ViewModels/MainViewVM.cs
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/ViewModels/MainViewVM.cs
@@ -81,6 +81,14 @@ namespace Tango.MachineStudio.UsersAndRoles.ViewModels
public RelayCommand AddOrganizationCommand { get; set; }
+ public RelayCommand RemoveOrganizationCommand { get; set; }
+
+ public RelayCommand BackToManagedOrganizationCommand { get; set; }
+
+ public RelayCommand<Role> RemoveRoleCommand { get; set; }
+
+ public RelayCommand SaveManagedUserCommand { get; set; }
+
public MainViewVM(UsersAndRolesNavigationManager navigation, INotificationProvider notification)
{
_navigation = navigation;
@@ -88,11 +96,15 @@ namespace Tango.MachineStudio.UsersAndRoles.ViewModels
LoadOrganizations();
- ManageOrganizationCommand = new RelayCommand(ManageOrganization, () => SelectedOrganization != null);
+ ManageOrganizationCommand = new RelayCommand(LoadSelectedOrganization, () => SelectedOrganization != null);
BackToOrganizationsCommand = new RelayCommand(BackToOrganizations);
ManageUserCommand = new RelayCommand(ManageUser, () => SelectedUser != null);
SaveOrganizationCommand = new RelayCommand(SaveOrganization);
AddOrganizationCommand = new RelayCommand(AddOrganization);
+ RemoveOrganizationCommand = new RelayCommand(RemoveOrganization, () => SelectedOrganization != null);
+ BackToManagedOrganizationCommand = new RelayCommand(BackToManagedOrganization);
+ RemoveRoleCommand = new RelayCommand<Role>(RemoveUserRole);
+ SaveManagedUserCommand = new RelayCommand(SaveManagedUser);
}
private async void AddOrganization()
@@ -111,7 +123,19 @@ namespace Tango.MachineStudio.UsersAndRoles.ViewModels
await org.SaveAsync(_organizationsContext);
Organizations = _organizationsContext.Organizations.ToObservableCollection();
SelectedOrganization = org;
- ManageOrganization();
+ LoadSelectedOrganization();
+ }
+ }
+ }
+
+ private async void RemoveOrganization()
+ {
+ if (_notification.ShowQuestion("Are you sure you want to remove " + SelectedOrganization.Name + " organization?"))
+ {
+ using (_notification.PushTaskItem("Removing organization..."))
+ {
+ await SelectedOrganization.DeleteCascadeAsync(_organizationsContext);
+ LoadOrganizations();
}
}
}
@@ -120,7 +144,7 @@ namespace Tango.MachineStudio.UsersAndRoles.ViewModels
{
using (_notification.PushTaskItem("Saving organization address and contact..."))
{
- ManagedOrganization.Contact.FullName = ManagedOrganization.Contact.FirstName + " " + ManagedOrganization.Contact.LastName;
+ ManagedOrganization.Contact.SetFullName();
await ManagedOrganization.SaveAsync(_manageContext);
LoadOrganizations();
SelectedOrganization = Organizations.SingleOrDefault(x => x.Guid == ManagedOrganization.Guid);
@@ -134,8 +158,8 @@ namespace Tango.MachineStudio.UsersAndRoles.ViewModels
Task.Factory.StartNew(() =>
{
_userContext = ObservablesContext.CreateDefault();
- Roles = _manageContext.Roles.ToObservableCollection();
- ManagedUser = _manageContext.Users.SingleOrDefault(x => x.Guid == SelectedUser.Guid);
+ Roles = _userContext.Roles.ToObservableCollection();
+ ManagedUser = _userContext.Users.SingleOrDefault(x => x.Guid == SelectedUser.Guid);
ManagedUserRoles = ManagedUser.Roles.ToObservableCollection();
InvokeUI(() => _navigation.NavigateTo(UsersAndRolesNavigationView.UserManagementView));
@@ -148,7 +172,32 @@ namespace Tango.MachineStudio.UsersAndRoles.ViewModels
_navigation.NavigateTo(UsersAndRolesNavigationView.OrganizationSelectionView);
}
- private void ManageOrganization()
+ private void BackToManagedOrganization()
+ {
+ _navigation.NavigateTo(UsersAndRolesNavigationView.OrganizationManagementView);
+ }
+
+ private void RemoveUserRole(Role role)
+ {
+ ManagedUserRoles.Remove(role);
+
+ foreach (var userRole in ManagedUser.UsersRoles.Where(x => x.Role == role).ToList())
+ {
+ userRole.DefferedDelete(_userContext);
+ }
+ }
+
+ private async void SaveManagedUser()
+ {
+ using (_notification.PushTaskItem("Saving user details..."))
+ {
+ ManagedUser.Contact.SetFullName();
+ await ManagedUser.SaveAsync(_userContext);
+ LoadSelectedOrganization();
+ }
+ }
+
+ private void LoadSelectedOrganization()
{
using (_notification.PushTaskItem("Loading organization..."))
{
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/Views/UserManagementView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/Views/UserManagementView.xaml
index eaeb180ab..b92682b84 100644
--- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/Views/UserManagementView.xaml
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/Views/UserManagementView.xaml
@@ -20,7 +20,7 @@
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
- <ColumnDefinition Width="300"/>
+ <ColumnDefinition Width="400"/>
</Grid.ColumnDefinitions>
<Grid Margin="10">
@@ -29,21 +29,27 @@
<Grid>
<StackPanel>
<StackPanel Orientation="Horizontal">
- <Image Source="../Images/user.png" Width="100" RenderOptions.BitmapScalingMode="Fant"></Image>
- <TextBlock Text="{Binding ManagedUser.Contact.FullName,FallbackValue='Roy Ben Shabat'}" VerticalAlignment="Center" FontSize="30" Margin="10 0 0 0"></TextBlock>
+ <Button MinWidth="160" Height="50" Command="{Binding BackToManagedOrganizationCommand}" HorizontalAlignment="Left">
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="KeyboardBackspace" Width="20" Height="20" />
+ <TextBlock Margin="5 0 0 0" FontSize="16">BACK</TextBlock>
+ </StackPanel>
+ </Button>
+ <Image Source="../Images/user.png" Width="100" RenderOptions.BitmapScalingMode="Fant" Margin="130 0 0 0"></Image>
+ <TextBlock Text="{Binding ManagedUser.Contact.FullName,FallbackValue='Roy Ben Shabat'}" VerticalAlignment="Center" FontSize="25" Margin="10 0 0 0"></TextBlock>
</StackPanel>
- <StackPanel Orientation="Horizontal" Margin="0 10 0 0">
+ <StackPanel Orientation="Horizontal" Margin="0 20 0 0" HorizontalAlignment="Center">
<StackPanel>
<TextBlock FontSize="16" FontWeight="SemiBold">ADDRESS</TextBlock>
- <Border Width="300" BorderThickness="1" BorderBrush="Gray" Margin="0 5 0 0" Padding="5" Height="300">
- <local:AddressView FontSize="10" />
+ <Border Width="300" BorderThickness="1" BorderBrush="Gray" Margin="0 5 0 0" Padding="5" Height="300" Background="#8EFFFFFF">
+ <local:AddressView FontSize="10" DataContext="{Binding ManagedUser.Address}" />
</Border>
</StackPanel>
<StackPanel Margin="10 0 0 0">
<TextBlock FontSize="16" FontWeight="SemiBold">CONTACT</TextBlock>
- <Border Width="300" BorderThickness="1" BorderBrush="Gray" Margin="0 5 0 0" Padding="5" Height="300">
- <local:ContactView FontSize="10" />
+ <Border Width="300" BorderThickness="1" BorderBrush="Gray" Margin="0 5 0 0" Padding="5" Height="300" Background="#8EFFFFFF">
+ <local:ContactView FontSize="10" DataContext="{Binding ManagedUser.Contact}" />
</Border>
</StackPanel>
</StackPanel>
@@ -51,7 +57,7 @@
</Grid>
</Grid>
<Grid DockPanel.Dock="Bottom">
- <Button Margin="0 10 0 0" MinWidth="200" Height="60" Command="{Binding ManageUserCommand}" HorizontalAlignment="Right">
+ <Button Margin="0 10 0 0" MinWidth="200" Height="60" Command="{Binding SaveManagedUserCommand}" HorizontalAlignment="Right">
<StackPanel Orientation="Horizontal">
<TextBlock FontSize="18" VerticalAlignment="Center">SAVE</TextBlock>
<materialDesign:PackIcon Margin="5 0 0 0" Kind="ContentSave" Width="30" Height="30" />
@@ -61,7 +67,7 @@
<Grid>
<DockPanel Margin="0 20 0 0">
<TextBlock DockPanel.Dock="Top" FontSize="16" FontWeight="SemiBold">ROLES</TextBlock>
- <Grid Margin="0 5 0 0" Style="{StaticResource droppableGrid}" dragAndDrop:DragAndDropService.Drop="OnDropRole">
+ <Grid Margin="0 5 0 0" Style="{StaticResource droppableGrid}" dragAndDrop:DragAndDropService.Drop="OnDropRole" Background="#7BFFFFFF">
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Top" Foreground="Silver" FontSize="20">DRAG &amp; DROP ROLES</TextBlock>
<Border BorderBrush="Gray" BorderThickness="1" Padding="10">
<ListBox ItemsSource="{Binding ManagedUserRoles}" ItemContainerStyle="{StaticResource basicListBoxItem}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled">
@@ -72,8 +78,25 @@
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type entities:Role}">
- <Grid Style="{StaticResource draggableGrid}">
- <Border Margin="5" CornerRadius="5" Width="100" Height="100" BorderThickness="1" Padding="2" IsHitTestVisible="False">
+ <Grid>
+ <Grid.ToolTip>
+ <StackPanel>
+ <TextBlock Text="{Binding Description}" FontSize="10" Margin="0 0 0 10"></TextBlock>
+ <ItemsControl ItemsSource="{Binding RolesPermissions}">
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <Grid>
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="Security" Width="12" />
+ <TextBlock Margin="5 0 0 0" FontSize="10" Text="{Binding Permission.Name}"></TextBlock>
+ </StackPanel>
+ </Grid>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+ </StackPanel>
+ </Grid.ToolTip>
+ <Border Margin="5" CornerRadius="5" Width="100" Height="100" BorderThickness="1" Padding="2">
<Border.Style>
<Style TargetType="Border">
<Setter Property="BorderBrush" Value="Silver"></Setter>
@@ -91,9 +114,26 @@
</LinearGradientBrush>
</Border.Background>
<Grid>
- <TextBlock Text="{Binding Name}"></TextBlock>
+ <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
+ <Image Source="../Images/roles.png" Width="32" RenderOptions.BitmapScalingMode="Fant"></Image>
+ <TextBlock Text="{Binding Name}" TextWrapping="Wrap" HorizontalAlignment="Center" TextAlignment="Center" FontSize="13" Margin="5"></TextBlock>
+ </StackPanel>
</Grid>
</Border>
+
+ <Button HorizontalAlignment="Right" VerticalAlignment="Top" Margin="10" Cursor="Hand" ToolTip="Remove Role" Command="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DataContext.RemoveRoleCommand}" CommandParameter="{Binding}">
+ <Button.Style>
+ <Style TargetType="Button" BasedOn="{StaticResource emptyButton}">
+ <Setter Property="Visibility" Value="Hidden"></Setter>
+ <Style.Triggers>
+ <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Grid},Path=IsMouseOver}" Value="True">
+ <Setter Property="Visibility" Value="Visible"></Setter>
+ </DataTrigger>
+ </Style.Triggers>
+ </Style>
+ </Button.Style>
+ <materialDesign:PackIcon Kind="Delete" Foreground="#FF5C5C" Width="16" Height="16" />
+ </Button>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
@@ -105,7 +145,7 @@
</DockPanel>
</Grid>
- <Grid Grid.Column="1" Background="#A9FFFFFF">
+ <Grid Grid.Column="1" Background="White">
<DockPanel Margin="10">
<StackPanel Orientation="Horizontal" DockPanel.Dock="Top">
<Image Source="../Images/roles.png" Width="70" RenderOptions.BitmapScalingMode="Fant"></Image>
@@ -117,6 +157,21 @@
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Background="Transparent" IsHitTestVisible="True" Style="{StaticResource draggableGrid}" dragAndDrop:DragAndDropService.DraggableBorderBrush="{StaticResource AccentColorBrush}" dragAndDrop:DragAndDropService.Draggable="True" dragAndDrop:DragAndDropService.DraggingSurface="{Binding RelativeSource={RelativeSource AncestorType=UserControl},Path=DraggingSurface}">
+ <Grid.ToolTip>
+ <StackPanel>
+ <TextBlock Text="{Binding Description}" FontSize="10" Margin="0 0 0 10"></TextBlock>
+ <ItemsControl ItemsSource="{Binding RolesPermissions}">
+ <ItemsControl.ItemTemplate>
+ <DataTemplate>
+ <StackPanel Orientation="Horizontal">
+ <materialDesign:PackIcon Kind="Security" Width="12" />
+ <TextBlock Margin="5 0 0 0" FontSize="10" Text="{Binding Permission.Name}"></TextBlock>
+ </StackPanel>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+ </StackPanel>
+ </Grid.ToolTip>
<DockPanel>
<Border DockPanel.Dock="Left" Width="100" Height="100" IsHitTestVisible="False" BorderBrush="Silver" BorderThickness="1" CornerRadius="5" Margin="5" Padding="2">
<Border.Background>
@@ -128,21 +183,31 @@
<Grid>
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<Image Source="../Images/roles.png" Width="32" RenderOptions.BitmapScalingMode="Fant"></Image>
- <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" TextAlignment="Center" FontSize="13" FontWeight="SemiBold" Margin="5"></TextBlock>
+ <TextBlock Text="{Binding Name}" TextWrapping="Wrap" HorizontalAlignment="Center" TextAlignment="Center" FontSize="13" Margin="5"></TextBlock>
</StackPanel>
</Grid>
</Border>
- <Grid>
+
+ <Grid MaxHeight="85" HorizontalAlignment="Left" Margin="20 0 0 0">
<ItemsControl ItemsSource="{Binding RolesPermissions}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
- <materialDesign:PackIcon Kind="Security" Width="16" />
- <TextBlock Text="{Binding Permission.Name}"></TextBlock>
+ <materialDesign:PackIcon Kind="Security" Width="12" />
+ <TextBlock Margin="5 0 0 0" FontSize="10" TextTrimming="CharacterEllipsis" MaxWidth="150" Text="{Binding Permission.Name}"></TextBlock>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
+
+ <Grid>
+ <Grid.Background>
+ <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
+ <GradientStop/>
+ <GradientStop Color="White" Offset="1"/>
+ </LinearGradientBrush>
+ </Grid.Background>
+ </Grid>
</Grid>
</DockPanel>
</Grid>
@@ -151,6 +216,8 @@
</ListBox>
</Grid>
</DockPanel>
+
+ <Rectangle HorizontalAlignment="Left" Stroke="#BBBBBB" StrokeThickness="1"></Rectangle>
</Grid>
</Grid>
diff --git a/Software/Visual_Studio/Tango.BL/EntitiesExtensions/Contact.cs b/Software/Visual_Studio/Tango.BL/EntitiesExtensions/Contact.cs
new file mode 100644
index 000000000..6ededa330
--- /dev/null
+++ b/Software/Visual_Studio/Tango.BL/EntitiesExtensions/Contact.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.BL.Entities
+{
+ public partial class Contact
+ {
+ public void SetFullName()
+ {
+ FullName = FirstName + " " + LastName;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Tango.BL/IObservableEntity.cs b/Software/Visual_Studio/Tango.BL/IObservableEntity.cs
index 9e0a8801d..586d4da21 100644
--- a/Software/Visual_Studio/Tango.BL/IObservableEntity.cs
+++ b/Software/Visual_Studio/Tango.BL/IObservableEntity.cs
@@ -78,5 +78,10 @@ namespace Tango.BL
/// Deletes this entity from the database.
/// </summary>
Task DeleteAsync(ObservablesContext context);
+
+ /// <summary>
+ /// Deletes this entity using an SQL statement which will cause the database delete cascade effect.
+ /// </summary>
+ Task DeleteCascadeAsync(ObservablesContext context);
}
}
diff --git a/Software/Visual_Studio/Tango.BL/ObservableEntity.cs b/Software/Visual_Studio/Tango.BL/ObservableEntity.cs
index add6877cb..43d5c06de 100644
--- a/Software/Visual_Studio/Tango.BL/ObservableEntity.cs
+++ b/Software/Visual_Studio/Tango.BL/ObservableEntity.cs
@@ -123,6 +123,18 @@ namespace Tango.BL
{
if (context == ObservablesEntitiesAdapter.Instance.Context)
{
+ var tableName = this.GetType().GetCustomAttribute<TableAttribute>().Name;
+
+ String propName = tableName.FromDalNameToTitleCase();
+
+ DbSet<T> set = ObservablesEntitiesAdapter.Instance.Context.GetType().GetProperty(propName, BindingFlags.Instance | BindingFlags.Public).GetValue(context) as DbSet<T>;
+ ObservableCollection<T> obs = ObservablesEntitiesAdapter.Instance.GetType().GetProperty(propName, BindingFlags.Instance | BindingFlags.Public).GetValue(ObservablesEntitiesAdapter.Instance) as ObservableCollection<T>;
+
+ if (!obs.Contains(this as T))
+ {
+ set.Add(this as T);
+ }
+
ObservablesEntitiesAdapter.Instance.SaveChanges();
}
else
@@ -284,6 +296,11 @@ Maybe you have deleted an entity that was no yet inserted into database?", LogCa
return me == other;
}
+ public Task DeleteCascadeAsync(ObservablesContext context)
+ {
+ return context.Database.ExecuteSqlCommandAsync(String.Format("DELETE FROM {0} WHERE GUID='{1}'", this.GetType().GetCustomAttribute<TableAttribute>().Name, Guid));
+ }
+
#region Operator Overloading
//public static bool operator ==(ObservableEntity<T> observable1, ObservableEntity<T> observable2)
diff --git a/Software/Visual_Studio/Tango.BL/Tango.BL.csproj b/Software/Visual_Studio/Tango.BL/Tango.BL.csproj
index b9565630d..8159e0f3b 100644
--- a/Software/Visual_Studio/Tango.BL/Tango.BL.csproj
+++ b/Software/Visual_Studio/Tango.BL/Tango.BL.csproj
@@ -85,6 +85,7 @@
<Compile Include="Dispensing\LubricantDispensingCalc.cs" />
<Compile Include="Dispensing\StandardColorDispensingCalc.cs" />
<Compile Include="Dispensing\TransparentLiquidDispensingCalc.cs" />
+ <Compile Include="EntitiesExtensions\Contact.cs" />
<Compile Include="ExtensionMethods\MediaColor.cs" />
<Compile Include="LiquidVolume.cs" />
<Compile Include="Entities\ActionType.cs" />
diff --git a/Software/Visual_Studio/Tango.Core/ExtensionMethods/StringExtensions.cs b/Software/Visual_Studio/Tango.Core/ExtensionMethods/StringExtensions.cs
index 048e942d5..e31456871 100644
--- a/Software/Visual_Studio/Tango.Core/ExtensionMethods/StringExtensions.cs
+++ b/Software/Visual_Studio/Tango.Core/ExtensionMethods/StringExtensions.cs
@@ -1,9 +1,11 @@
using System;
using System.Collections.Generic;
using System.Data.Entity.Design.PluralizationServices;
+using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
+using System.Threading;
using System.Threading.Tasks;
/// <summary>
@@ -55,6 +57,26 @@ public static class StringExtensions
}
/// <summary>
+ /// Formats the string as title case.
+ /// </summary>
+ /// <param name="str">The string.</param>
+ /// <returns></returns>
+ public static String ToTitleCase(this String str)
+ {
+ return Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
+ }
+
+ /// <summary>
+ /// Converts the specified database conventional name to the observables conventional name.
+ /// </summary>
+ /// <param name="dalName">DAL name.</param>
+ /// <returns></returns>
+ public static String FromDalNameToTitleCase(this String dalName)
+ {
+ return String.Join("", dalName.Split('_').Select(x => ToTitleCase(x)));
+ }
+
+ /// <summary>
/// Singularizes the string.
/// </summary>
/// <param name="text">The text.</param>