diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-03-11 14:03:02 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-03-11 14:03:02 +0200 |
| commit | c923d6611ffa64605879779c490a979e03daa189 (patch) | |
| tree | 8fedfe9963847146018c18ceee9cce7e0d0d579e /Software | |
| parent | 4188ea39897f5aa3bc4be5a44358b79436baf0b4 (diff) | |
| download | Tango-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.sql | bin | 0 -> 2824 bytes | |||
| -rw-r--r-- | Software/DB/Change Scripts/Cascade User Delete To Contact and Address.sql | bin | 0 -> 3816 bytes | |||
| -rw-r--r-- | Software/DB/Tango.mdf | bin | 75497472 -> 75497472 bytes | |||
| -rw-r--r-- | Software/DB/Tango_log.ldf | bin | 1048576 -> 1048576 bytes | |||
| -rw-r--r-- | Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/ViewModels/MainViewVM.cs | 61 | ||||
| -rw-r--r-- | Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.UsersAndRoles/Views/UserManagementView.xaml | 103 | ||||
| -rw-r--r-- | Software/Visual_Studio/Tango.BL/EntitiesExtensions/Contact.cs | 16 | ||||
| -rw-r--r-- | Software/Visual_Studio/Tango.BL/IObservableEntity.cs | 5 | ||||
| -rw-r--r-- | Software/Visual_Studio/Tango.BL/ObservableEntity.cs | 17 | ||||
| -rw-r--r-- | Software/Visual_Studio/Tango.BL/Tango.BL.csproj | 1 | ||||
| -rw-r--r-- | Software/Visual_Studio/Tango.Core/ExtensionMethods/StringExtensions.cs | 22 |
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 Binary files differnew file mode 100644 index 000000000..a0a38b6dc --- /dev/null +++ b/Software/DB/Change Scripts/Cascade Machine Delete To Configuration.sql 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 Binary files differnew file mode 100644 index 000000000..052655968 --- /dev/null +++ b/Software/DB/Change Scripts/Cascade User Delete To Contact and Address.sql diff --git a/Software/DB/Tango.mdf b/Software/DB/Tango.mdf Binary files differindex 598a7c37e..cb00adf1a 100644 --- a/Software/DB/Tango.mdf +++ b/Software/DB/Tango.mdf diff --git a/Software/DB/Tango_log.ldf b/Software/DB/Tango_log.ldf Binary files differindex 1411d7c4e..972799de3 100644 --- a/Software/DB/Tango_log.ldf +++ b/Software/DB/Tango_log.ldf 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 & 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> |
