aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2017-12-19 12:28:20 +0200
committerAvi Levkovich <avi@twine-s.com>2017-12-19 12:28:20 +0200
commit76aa983631df4fa5b16b170e2f6dd845c5ac9531 (patch)
tree6b2b4d0776c54536ec07aabc6be94857dcee91fc /Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels
parent6bf71c81050b824398dc82ce4b69cdf71fb4a2f7 (diff)
parentb421701fd5cf000a16cab9b1fe9eda812ccce8c3 (diff)
downloadTango-76aa983631df4fa5b16b170e2f6dd845c5ac9531.tar.gz
Tango-76aa983631df4fa5b16b170e2f6dd845c5ac9531.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels')
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/AddressesViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationDisplayPanelVersionsViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationFirmwareVersionsViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationOsVersionsViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationVersionsViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgeTypesViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgesViewVM.cs18
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ConfigurationsViewVM.cs24
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DbTableViewModel.cs320
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DialogOpenMode.cs14
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispenserTypesViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispensersViewVM.cs18
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedFirmwareVersionsViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedSoftwareVersionsViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EntityViewModel.cs31
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/HardwareVersionsViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPacksViewVM.cs18
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidsViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachineVersionsViewVM.cs18
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachinesViewVM.cs26
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MainViewVM.cs18
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MultiComboVM.cs44
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/OrganizationsViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/PermissionsViewVM.cs17
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RolesViewVM.cs77
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/UsersViewVM.cs95
26 files changed, 942 insertions, 0 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/AddressesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/AddressesViewVM.cs
new file mode 100644
index 000000000..41eab1c37
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/AddressesViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class AddressesViewVM : DbTableViewModel<Address>
+ {
+ public AddressesViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationDisplayPanelVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationDisplayPanelVersionsViewVM.cs
new file mode 100644
index 000000000..be458136a
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationDisplayPanelVersionsViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class ApplicationDisplayPanelVersionsViewVM : DbTableViewModel<ApplicationDisplayPanelVersion>
+ {
+ public ApplicationDisplayPanelVersionsViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationFirmwareVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationFirmwareVersionsViewVM.cs
new file mode 100644
index 000000000..0814988ba
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationFirmwareVersionsViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class ApplicationFirmwareVersionsViewVM : DbTableViewModel<ApplicationFirmwareVersion>
+ {
+ public ApplicationFirmwareVersionsViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationOsVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationOsVersionsViewVM.cs
new file mode 100644
index 000000000..3cdd8acb7
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationOsVersionsViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class ApplicationOsVersionsViewVM : DbTableViewModel<ApplicationOsVersion>
+ {
+ public ApplicationOsVersionsViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationVersionsViewVM.cs
new file mode 100644
index 000000000..6e25fe321
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ApplicationVersionsViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class ApplicationVersionsViewVM : DbTableViewModel<ApplicationVersion>
+ {
+ public ApplicationVersionsViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgeTypesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgeTypesViewVM.cs
new file mode 100644
index 000000000..c8c6ba00b
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgeTypesViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class CartridgeTypesViewVM : DbTableViewModel<CartridgeType>
+ {
+ public CartridgeTypesViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgesViewVM.cs
new file mode 100644
index 000000000..8db217013
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/CartridgesViewVM.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class CartridgesViewVM : DbTableViewModel<Cartridge>
+ {
+ public CartridgesViewVM(INotificationProvider notification) : base(notification)
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ConfigurationsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ConfigurationsViewVM.cs
new file mode 100644
index 000000000..617faab31
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/ConfigurationsViewVM.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class ConfigurationsViewVM : DbTableViewModel<Configuration>
+ {
+ public ConfigurationsViewVM(INotificationProvider notification) : base(notification)
+ {
+
+ }
+
+ protected override void InitializeEntity(Configuration entity)
+ {
+ base.InitializeEntity(entity);
+ entity.CreationDate = DateTime.Now;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DbTableViewModel.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DbTableViewModel.cs
new file mode 100644
index 000000000..b6d77748e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DbTableViewModel.cs
@@ -0,0 +1,320 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Core.Commands;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+using Tango.MachineStudio.DB.Managers;
+using Tango.SharedUI;
+using Tango.MachineStudio.DB.ExtensionMethods;
+using System.Data.Entity.Infrastructure;
+using GalaSoft.MvvmLight.Messaging;
+using Tango.MachineStudio.DB.Messages;
+using System.Collections.ObjectModel;
+using System.Reflection;
+using Tango.MachineStudio.Common.StudioApplication;
+using System.ComponentModel;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public abstract class DbTableViewModel<T> : ViewModel, IShutdownRequestBlocker where T : class, IObservableEntity
+ {
+ private INotificationProvider _notification;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DbTableViewModel"/> class.
+ /// </summary>
+ public DbTableViewModel(INotificationProvider notification) : base()
+ {
+ _notification = notification;
+ Adapter = ObservablesEntitiesAdapter.Instance;
+ ValidationErrors = new ObservableCollection<string>();
+
+ AddCommand = new RelayCommand(OnAdd);
+ EditCommand = new RelayCommand(OnEdit, (x) => SelectedEntity != null);
+ DeleteCommand = new RelayCommand(OnDelete, (x) => SelectedEntity != null);
+ DialogOKCommand = new RelayCommand(() => OnDialogOKPressed(DialogOpenMode, EditEntity));
+ DialogCancelCommand = new RelayCommand(() => OnDialogCancelPressed(DialogOpenMode, EditEntity));
+
+ IsDialogOpen = false;
+ }
+
+ private T _editEntity;
+ /// <summary>
+ /// Gets or sets the edit entity.
+ /// </summary>
+ public T EditEntity
+ {
+ get { return _editEntity; }
+ set { _editEntity = value; RaisePropertyChangedAuto(); }
+ }
+
+ private DialogOpenMode _dialogOpenMode;
+ /// <summary>
+ /// Gets or sets the dialog open mode.
+ /// </summary>
+ public DialogOpenMode DialogOpenMode
+ {
+ get { return _dialogOpenMode; }
+ set { _dialogOpenMode = value; RaisePropertyChangedAuto(); }
+ }
+
+ private bool _isDialogOpen;
+ /// <summary>
+ /// Gets or sets a value indicating whether this instance is dialog open.
+ /// </summary>
+ public bool IsDialogOpen
+ {
+ get { return _isDialogOpen; }
+ set { _isDialogOpen = value; RaisePropertyChangedAuto(); }
+ }
+
+ private ObservablesEntitiesAdapter _adapter;
+ /// <summary>
+ /// Gets or sets the DB adapter.
+ /// </summary>
+ public ObservablesEntitiesAdapter Adapter
+ {
+ get { return _adapter; }
+ set { _adapter = value; RaisePropertyChangedAuto(); }
+ }
+
+ private T _selectedEntity;
+ /// <summary>
+ /// Gets or sets the selected entity.
+ /// </summary>
+ public T SelectedEntity
+ {
+ get { return _selectedEntity; }
+ set { _selectedEntity = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
+ }
+
+ private String _filter;
+ /// <summary>
+ /// Gets or sets the search filter.
+ /// </summary>
+ public String Filter
+ {
+ get { return _filter; }
+ set { _filter = value; RaisePropertyChangedAuto(); OnFilterChanged(value); }
+ }
+
+ private ObservableCollection<String> _validationErrors;
+ /// <summary>
+ /// Gets or sets the validation errors.
+ /// </summary>
+ public ObservableCollection<String> ValidationErrors
+ {
+ get { return _validationErrors; }
+ set { _validationErrors = value; RaisePropertyChangedAuto(); }
+ }
+
+ /// <summary>
+ /// Gets or sets the dialog OK command.
+ /// </summary>
+ public RelayCommand DialogOKCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the dialog cancel command.
+ /// </summary>
+ public RelayCommand DialogCancelCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the add command.
+ /// </summary>
+ public RelayCommand AddCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the edit command.
+ /// </summary>
+ public RelayCommand EditCommand { get; set; }
+
+ /// <summary>
+ /// Gets or sets the delete command.
+ /// </summary>
+ public RelayCommand DeleteCommand { get; set; }
+
+ protected override void OnValidating()
+ {
+ base.OnValidating();
+ ValidationErrors.Clear();
+
+ foreach (var prop in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => !x.PropertyType.IsGenericType && x.PropertyType.IsClass && !x.Name.Contains("Guid")))
+ {
+ if (prop.GetValue(EditEntity) == null)
+ {
+ ValidationErrors.Add(prop.Name + " is required");
+ }
+ }
+ }
+
+ /// <summary>
+ /// Called when delete command invoked.
+ /// </summary>
+ protected virtual async void OnDelete()
+ {
+ using (_notification.PushTaskItem("Saving changes to database..."))
+ {
+ var dependenctEntities = SelectedEntity.GetDependentEntitiesNameAndGuid();
+
+ if (dependenctEntities.Count > 0)
+ {
+ _notification.ShowError("The selected entity is being used by " + dependenctEntities.Count + " other entities." + Environment.NewLine + "Please delete any dependencies and try again." + Environment.NewLine + Environment.NewLine + String.Join(Environment.NewLine,dependenctEntities.Select(x => x.Key + ", ID: " + x.Value)));
+ return;
+ }
+
+ try
+ {
+ SelectedEntity.Deleted = true;
+ await SelectedEntity.SaveAsync();
+ }
+ catch (Exception ex)
+ {
+ SelectedEntity.Deleted = false;
+ Adapter.Invalidate();
+ _notification.ShowError("Could not delete entity.");
+ }
+
+ SelectedEntity = null;
+ }
+ }
+
+ /// <summary>
+ /// Called when edit command invoked.
+ /// </summary>
+ protected virtual void OnEdit()
+ {
+ ValidationErrors.Clear();
+ DialogOpenMode = DialogOpenMode.Editing;
+ EditEntity = GetEditableEntity(DialogOpenMode);
+ //_notification.ShowDialog(DialogOpenMode, this);
+ Messenger.Default.Send(new OpenEntityEditViewMessage(DialogOpenMode, this, typeof(T)));
+ IsDialogOpen = true;
+ }
+
+ /// <summary>
+ /// Called when add command invoked.
+ /// </summary>
+ protected virtual void OnAdd()
+ {
+ ValidationErrors.Clear();
+ DialogOpenMode = DialogOpenMode.Adding;
+ EditEntity = GetEditableEntity(DialogOpenMode);
+ //_notification.ShowDialog(DialogOpenMode, this);
+ Messenger.Default.Send(new OpenEntityEditViewMessage(DialogOpenMode, this, typeof(T)));
+ IsDialogOpen = true;
+ }
+
+ /// <summary>
+ /// Called when dialog closes with OK button.
+ /// </summary>
+ /// <param name="mode">The mode.</param>
+ protected virtual async void OnDialogOKPressed(DialogOpenMode mode, T entity)
+ {
+ if (!Validate()) return;
+
+ if (ValidationErrors.Count > 0) return;
+
+ Messenger.Default.Send(new CloseEntityEditViewMessage());
+
+ if (mode == DialogOpenMode.Editing)
+ {
+ entity.ShallowCopyTo(SelectedEntity);
+ entity = SelectedEntity;
+ }
+
+ OnBeforeEntitySave(mode, entity);
+
+ using (_notification.PushTaskItem("Saving changes to database..."))
+ {
+ try
+ {
+ await entity.SaveAsync();
+ }
+ catch (DbUpdateException ex)
+ {
+ Adapter.Invalidate();
+ _notification.ShowError("Could not save entity." + Environment.NewLine + ex.InnerException.InnerException != null ? ex.InnerException.InnerException.Message : ex.InnerException.Message);
+ }
+ catch (Exception ex)
+ {
+ Adapter.Invalidate();
+ _notification.ShowError("Could not save entity." + Environment.NewLine + "Please make sure all fields are properly populated.");
+ }
+ IsDialogOpen = false;
+ SelectedEntity = EditEntity;
+ SelectedEntity = null;
+ }
+ }
+
+ /// <summary>
+ /// Called when [before entity save].
+ /// </summary>
+ /// <param name="mode">The mode.</param>
+ /// <param name="entity">The entity.</param>
+ protected virtual void OnBeforeEntitySave(DialogOpenMode mode, T entity)
+ {
+
+ }
+
+ /// <summary>
+ /// Called when dialog closes with cancel button.
+ /// </summary>
+ /// <param name="mode">The mode.</param>
+ protected virtual void OnDialogCancelPressed(DialogOpenMode mode, T entity)
+ {
+ Messenger.Default.Send(new CloseEntityEditViewMessage());
+ IsDialogOpen = false;
+ }
+
+ /// <summary>
+ /// Gets the editable entity.
+ /// </summary>
+ /// <param name="mode">The mode.</param>
+ /// <returns></returns>
+ private T GetEditableEntity(DialogOpenMode mode)
+ {
+ if (mode == DialogOpenMode.Adding)
+ {
+ var newEntity = Activator.CreateInstance<T>();
+ InitializeEntity(newEntity);
+ return newEntity;
+ }
+ else
+ {
+ return SelectedEntity.ShallowClone();
+ }
+ }
+
+ protected virtual void OnFilterChanged(String filter)
+ {
+ String viewSourceName = this.GetType().Name.Replace("ViewVM", "ViewSource");
+ ICollectionView collectionView = Adapter.GetType().GetProperty(viewSourceName).GetValue(Adapter) as ICollectionView;
+
+ collectionView.Filter = (entity) =>
+ {
+ return
+ entity.
+ GetType().
+ GetProperties(BindingFlags.Public | BindingFlags.Instance).
+ Where(x => x.Name != "Deleted" && x.Name != "ID" && x.Name != "LastUpdated").
+ Where(x => !x.PropertyType.IsGenericType && (x.PropertyType.IsClass || x.PropertyType == typeof(String))).
+ Select(prop => prop.GetValue(entity).ToString()).
+ ToList().
+ Any(x => x.ToLower().Contains(filter.ToLower()));
+ };
+ }
+
+ protected virtual void InitializeEntity(T entity)
+ {
+
+ }
+
+ public Task<bool> OnShutdownRequest()
+ {
+ return Task.FromResult(true);
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DialogOpenMode.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DialogOpenMode.cs
new file mode 100644
index 000000000..0d46a9734
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DialogOpenMode.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public enum DialogOpenMode
+ {
+ Editing,
+ Adding,
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispenserTypesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispenserTypesViewVM.cs
new file mode 100644
index 000000000..5ffe0d58c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispenserTypesViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class DispenserTypesViewVM : DbTableViewModel<DispenserType>
+ {
+ public DispenserTypesViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispensersViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispensersViewVM.cs
new file mode 100644
index 000000000..0242c1dc7
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/DispensersViewVM.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class DispensersViewVM : DbTableViewModel<Dispenser>
+ {
+ public DispensersViewVM(INotificationProvider notification) : base(notification)
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedFirmwareVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedFirmwareVersionsViewVM.cs
new file mode 100644
index 000000000..a248d919a
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedFirmwareVersionsViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class EmbeddedFirmwareVersionsViewVM : DbTableViewModel<EmbeddedFirmwareVersion>
+ {
+ public EmbeddedFirmwareVersionsViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedSoftwareVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedSoftwareVersionsViewVM.cs
new file mode 100644
index 000000000..b6436203d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EmbeddedSoftwareVersionsViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class EmbeddedSoftwareVersionsViewVM : DbTableViewModel<EmbeddedSoftwareVersion>
+ {
+ public EmbeddedSoftwareVersionsViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EntityViewModel.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EntityViewModel.cs
new file mode 100644
index 000000000..946a73088
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/EntityViewModel.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Core.Commands;
+using Tango.SharedUI;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class EntityViewModel<T> : ViewModel
+ {
+ private T _entity;
+
+ public T Entity
+ {
+ get { return _entity; }
+ set { _entity = value; RaisePropertyChanged(nameof(Entity)); }
+ }
+
+ public EntityViewModel() : base()
+ {
+
+ }
+
+ public EntityViewModel(T entity) : this()
+ {
+ Entity = entity;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/HardwareVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/HardwareVersionsViewVM.cs
new file mode 100644
index 000000000..02c90c442
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/HardwareVersionsViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class HardwareVersionsViewVM : DbTableViewModel<HardwareVersion>
+ {
+ public HardwareVersionsViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPacksViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPacksViewVM.cs
new file mode 100644
index 000000000..202dd959f
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/IdsPacksViewVM.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class IdsPacksViewVM : DbTableViewModel<IdsPack>
+ {
+ public IdsPacksViewVM(INotificationProvider notification) : base(notification)
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidsViewVM.cs
new file mode 100644
index 000000000..e57f6606e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/LiquidsViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class LiquidsViewVM : DbTableViewModel<Liquid>
+ {
+ public LiquidsViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachineVersionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachineVersionsViewVM.cs
new file mode 100644
index 000000000..6a24f7d4c
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachineVersionsViewVM.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class MachineVersionsViewVM : DbTableViewModel<MachineVersion>
+ {
+ public MachineVersionsViewVM(INotificationProvider notification) : base(notification)
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachinesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachinesViewVM.cs
new file mode 100644
index 000000000..fbec464bd
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MachinesViewVM.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.Core.Commands;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+using Tango.SharedUI;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class MachinesViewVM : DbTableViewModel<Machine>
+ {
+ public MachinesViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+
+ protected override void InitializeEntity(Machine entity)
+ {
+ base.InitializeEntity(entity);
+ entity.ProductionDate = DateTime.Now;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MainViewVM.cs
new file mode 100644
index 000000000..a0ce93a5a
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MainViewVM.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using Tango.SharedUI;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class MainViewVM : ViewModel
+ {
+ public MainViewVM() : base()
+ {
+
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MultiComboVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MultiComboVM.cs
new file mode 100644
index 000000000..d15ac6e11
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/MultiComboVM.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.SharedUI;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class MultiComboVM<T> : EntityViewModel<T>
+ {
+ private Action _onSelectionChanged;
+
+ public event EventHandler SelectionChanged;
+
+ public MultiComboVM(T entity) : base(entity)
+ {
+
+ }
+
+ public MultiComboVM(T entity, Action onSelectionChanged) : this(entity)
+ {
+ _onSelectionChanged = onSelectionChanged;
+ }
+
+ private bool _isSelected;
+
+ public bool IsSelected
+ {
+ get { return _isSelected; }
+ set { _isSelected = value; RaisePropertyChangedAuto(); OnSelectionChanged(); }
+ }
+
+ protected virtual void OnSelectionChanged()
+ {
+ if (_onSelectionChanged != null)
+ {
+ _onSelectionChanged();
+ }
+
+ SelectionChanged?.Invoke(this, new EventArgs());
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/OrganizationsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/OrganizationsViewVM.cs
new file mode 100644
index 000000000..0327557f1
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/OrganizationsViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class OrganizationsViewVM : DbTableViewModel<Organization>
+ {
+ public OrganizationsViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/PermissionsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/PermissionsViewVM.cs
new file mode 100644
index 000000000..9a2d1c24d
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/PermissionsViewVM.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class PermissionsViewVM : DbTableViewModel<Permission>
+ {
+ public PermissionsViewVM(INotificationProvider notification) : base(notification)
+ {
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RolesViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RolesViewVM.cs
new file mode 100644
index 000000000..d09722ec9
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/RolesViewVM.cs
@@ -0,0 +1,77 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+using Tango.MachineStudio.DB.ViewModels;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class RolesViewVM : DbTableViewModel<Role>
+ {
+ public RolesViewVM(INotificationProvider notification) : base(notification)
+ {
+ SelectedPermissions = new ObservableCollection<MultiComboVM<Permission>>();
+ }
+
+ private ObservableCollection<MultiComboVM<Permission>> _selectedPermissions;
+ public ObservableCollection<MultiComboVM<Permission>> SelectedPermissions
+ {
+ get { return _selectedPermissions; }
+ set { _selectedPermissions = value; RaisePropertyChangedAuto(); }
+ }
+
+ protected override void OnEdit()
+ {
+ SelectedPermissions = Adapter.Permissions.Select(x => new MultiComboVM<Permission>(x, () => RaisePropertyChanged(nameof(SelectedPermissions)))).ToObservableCollection();
+
+ foreach (var permission in SelectedPermissions)
+ {
+ if (SelectedEntity.RolesPermissions.ToList().Exists(x => x.Permission == permission.Entity && !x.Deleted))
+ {
+ permission.IsSelected = true;
+ }
+ }
+
+ base.OnEdit();
+ }
+
+ protected override void OnAdd()
+ {
+ SelectedPermissions = Adapter.Permissions.Select(x => new MultiComboVM<Permission>(x, () => RaisePropertyChanged(nameof(SelectedPermissions)))).ToObservableCollection();
+
+ base.OnAdd();
+ }
+
+ protected override void OnBeforeEntitySave(DialogOpenMode mode, Role role)
+ {
+ base.OnBeforeEntitySave(mode, role);
+
+ foreach (var permission in SelectedPermissions)
+ {
+ var rolePermission = role.RolesPermissions.SingleOrDefault(x => x.Permission == permission.Entity);
+
+ if (rolePermission != null)
+ {
+ rolePermission.Deleted = !permission.IsSelected;
+ }
+ else
+ {
+ if (permission.IsSelected)
+ {
+ role.RolesPermissions.Add(new RolesPermission()
+ {
+ Permission = permission.Entity,
+ Role = role,
+ PermissionGuid = permission.Entity.Guid,
+ RoleGuid = role.Guid
+ });
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/UsersViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/UsersViewVM.cs
new file mode 100644
index 000000000..6af1184aa
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.DB/ViewModels/UsersViewVM.cs
@@ -0,0 +1,95 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Tango.DAL.Observables;
+using Tango.MachineStudio.Common.Notifications;
+using SimpleValidator.Extensions;
+
+namespace Tango.MachineStudio.DB.ViewModels
+{
+ public class UsersViewVM : DbTableViewModel<User>
+ {
+ public UsersViewVM(INotificationProvider notification) : base(notification)
+ {
+ SelectedRoles = new ObservableCollection<MultiComboVM<Role>>();
+ }
+
+ private ObservableCollection<MultiComboVM<Role>> _selectedRoles;
+ public ObservableCollection<MultiComboVM<Role>> SelectedRoles
+ {
+ get { return _selectedRoles; }
+ set { _selectedRoles = value; RaisePropertyChangedAuto(); }
+ }
+
+ protected override void OnEdit()
+ {
+ SelectedRoles = Adapter.Roles.Select(x => new MultiComboVM<Role>(x, () => RaisePropertyChanged(nameof(SelectedRoles)))).ToObservableCollection();
+
+ foreach (var role in SelectedRoles)
+ {
+ if (SelectedEntity.UsersRoles.ToList().Exists(x => x.Role == role.Entity && !x.Deleted))
+ {
+ role.IsSelected = true;
+ }
+ }
+
+ base.OnEdit();
+ }
+
+ protected override void OnAdd()
+ {
+ SelectedRoles = Adapter.Roles.Select(x => new MultiComboVM<Role>(x, () => RaisePropertyChanged(nameof(SelectedRoles)))).ToObservableCollection();
+
+ base.OnAdd();
+ }
+
+ protected override void OnBeforeEntitySave(DialogOpenMode mode, User user)
+ {
+ base.OnBeforeEntitySave(mode, user);
+
+ foreach (var role in SelectedRoles)
+ {
+ var userRole = user.UsersRoles.SingleOrDefault(x => x.Role == role.Entity);
+
+ if (userRole != null)
+ {
+ userRole.Deleted = !role.IsSelected;
+ }
+ else
+ {
+ if (role.IsSelected)
+ {
+ user.UsersRoles.Add(new UsersRole()
+ {
+ Role = role.Entity,
+ User = user,
+ RoleGuid = role.Entity.Guid,
+ UserGuid = user.Guid
+ });
+ }
+ }
+ }
+ }
+
+ protected override void OnValidating()
+ {
+ base.OnValidating();
+
+ if (EditEntity.Email != null)
+ {
+ if (Adapter.Users.ToList().Exists(x => x.Email.ToLower() == EditEntity.Email.ToLower()))
+ {
+ ValidationErrors.Add("Email already exist");
+ }
+ }
+
+ if (!EditEntity.Password.IsMinLength(4))
+ {
+ ValidationErrors.Add("Password must have at least 4 characters");
+ }
+ }
+ }
+}