Advertisement
Iyon_Groznyy

Untitled

Feb 22nd, 2022
694
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.52 KB | None | 0 0
  1. public class OrdersViewModel : BaseItemsPageViewModel<BaseViewModel>
  2.     {
  3.         private const int PaginationSize = 10;
  4.  
  5.         private readonly IOrdersManager ordersManager;
  6.         private readonly IUserDialogs userDialogs;
  7.         private readonly IEmployeesManager employeesManager;
  8.         private readonly INomenclatureManager nomenclatureManager;
  9.         private readonly IUserSession userSession;
  10.  
  11.         private IDisposable[]? itemSubscriptions;
  12.  
  13.         public OrdersViewModel(
  14.             IOrdersManager ordersManager,
  15.             IUserDialogs userDialogs,
  16.             IEmployeesManager employeesManager,
  17.             INomenclatureManager nomenclatureManager,
  18.             IUserSession userSession)
  19.         {
  20.             this.ordersManager = ordersManager;
  21.             this.userDialogs = userDialogs;
  22.             this.employeesManager = employeesManager;
  23.             this.nomenclatureManager = nomenclatureManager;
  24.             this.userSession = userSession;
  25.  
  26.             FiltersItems = new MvxObservableCollection<SelectableItemViewModel<OrdersFilterMode>>(CreateItems(OrdersFilterMode.All));
  27.             PaginationViewModel = new PaginationViewModel(LoadMoreItemsAsync, PaginationSize);
  28.             MainToolbarViewModel = CompositionRoot.Container.Resolve<MainToolbarViewModel>();
  29.  
  30.             GoToFeedCommand = this.CreateCommand(GoToFeedAsync);
  31.             GoToContactsCommand = this.CreateCommand(GoToContactsAsync);
  32.             AddOrderCommand = this.CreateCommand(AddOrderAsync);
  33.             DeleteOrdersCommand = this.CreateCommand(DeleteOrdersAsync);
  34.             CancelCommand = this.CreateCommand(Cancel);
  35.             FilterItemSelectedCommand = this.CreateCommand<SelectableItemViewModel<OrdersFilterMode>>(FilterItemSelected);
  36.         }
  37.  
  38.         public IMvxCommand AddOrderCommand { get; }
  39.         public IMvxCommand DeleteOrdersCommand { get; }
  40.         public IMvxCommand FilterItemSelectedCommand { get; }
  41.         public IMvxCommand CancelCommand { get; }
  42.         public IMvxCommand GoToFeedCommand { get; }
  43.         public IMvxCommand GoToContactsCommand { get; }
  44.  
  45.         public PaginationViewModel PaginationViewModel { get; }
  46.  
  47.         public MainToolbarViewModel MainToolbarViewModel { get; }
  48.  
  49.         public SelectableItemViewModel<OrdersFilterMode>? SelectedFilter => FiltersItems.FirstOrDefault(item => item.IsSelected);
  50.  
  51.         private bool isSelectionMode;
  52.         public bool IsSelectionMode
  53.         {
  54.             get => isSelectionMode;
  55.             set => SetProperty(ref isSelectionMode, value, OnIsSelectionModeChanged);
  56.         }
  57.  
  58.         public string SeletedItemsCount => GetItemsCount();
  59.  
  60.         public bool IsAnyItemSelect => SelectedItemsCount > 0;
  61.  
  62.         private int selectedItemsCount;
  63.         public int SelectedItemsCount
  64.         {
  65.             get => selectedItemsCount;
  66.             set
  67.             {
  68.                 SetProperty(ref selectedItemsCount, value);
  69.                 RaisePropertyChanged(nameof(IsAnyItemSelect));
  70.                 RaisePropertyChanged(nameof(SeletedItemsCount));
  71.             }
  72.         }
  73.  
  74.         public MvxObservableCollection<SelectableItemViewModel<OrdersFilterMode>> FiltersItems { get; set; }
  75.  
  76.         public override Task InitializeAsync()
  77.         {
  78.             return RefreshDataAsync();
  79.         }
  80.  
  81.         protected override Task RefreshDataAsync()
  82.         {
  83.             Items.Clear();
  84.             PaginationViewModel.Reset();
  85.  
  86.             return Task.WhenAll(
  87.                 base.RefreshDataAsync(),
  88.                 PaginationViewModel.LoadMoreItemsCommand.ExecuteAsync());
  89.         }
  90.  
  91.         protected override void OnItemsCollectionChanged()
  92.         {
  93.             base.OnItemsCollectionChanged();
  94.  
  95.             itemSubscriptions?.ForEach(subscription => subscription.Dispose());
  96.             itemSubscriptions = Items
  97.                 .OfType<OrderItemViewModel>()
  98.                 .Select(item => item.SubscribeToPropertyChanged(nameof(OrderItemViewModel.IsSelected), () => OnAnyItemIsSelectedChanged(item)))
  99.                 .ToArray();
  100.         }
  101.  
  102.         protected override void Dispose(bool disposing)
  103.         {
  104.             if (disposing)
  105.             {
  106.                 itemSubscriptions?.ForEach(subscription => subscription.Dispose());
  107.                 itemSubscriptions = null;
  108.             }
  109.  
  110.             base.Dispose(disposing);
  111.         }
  112.  
  113.         private async Task<int> LoadMoreItemsAsync(int pageIndex, int pageSize)
  114.         {
  115.             var selectedFilterMode = SelectedFilter?.Key ?? OrdersFilterMode.All;
  116.  
  117.             var response = await ordersManager.GetOrdersAsync(selectedFilterMode, pageIndex, pageSize, CancellationToken.None);
  118.             if (!response.IsSuccessful)
  119.             {
  120.                 return 0;
  121.             }
  122.  
  123.             var items = response.Data.Items.Select(order => new OrderItemViewModel(
  124.                 order,
  125.                 ItemTappedAsync,
  126.                 ItemLongTappedAsync,
  127.                 ExecutionStateWrapper)).ToArray();
  128.  
  129.             Items.AddRange(items);
  130.  
  131.             PaginationViewModel.SetTotalItemsCount(response.Data.TotalCount);
  132.             return items.Length;
  133.         }
  134.  
  135.         private async Task ItemTappedAsync(OrderItemViewModel orderItemViewModel)
  136.         {
  137.             var order = await NavigationManager.NavigateAsync<OrderDetailsViewModel, Order, Order?>(orderItemViewModel.Order);
  138.             if (order is null)
  139.             {
  140.                 Items.Remove(orderItemViewModel);
  141.                 return;
  142.             }
  143.  
  144.             orderItemViewModel.UpdateOrder(order!);
  145.         }
  146.  
  147.         protected async Task ItemLongTappedAsync(OrderItemViewModel orderItemViewModel)
  148.         {
  149.             var result = await userDialogs.ActionSheetAsync(
  150.                 AppStrings.SelectActions,
  151.                 AppStrings.Cancel,
  152.                 AppStrings.Delete,
  153.                 null,
  154.                 AppStrings.Select,
  155.                 AppStrings.Edit);
  156.  
  157.             if (result == AppStrings.Cancel)
  158.             {
  159.                 return;
  160.             }
  161.  
  162.             if (result == AppStrings.Select)
  163.             {
  164.                 IsSelectionMode = true;
  165.                 orderItemViewModel.IsSelected = true;
  166.                 return;
  167.             }
  168.  
  169.             if (result == AppStrings.Delete)
  170.             {
  171.                 await ordersManager.DeleteAsync(orderItemViewModel.Order.Id, CancellationToken.None);
  172.                 Items.Remove(orderItemViewModel);
  173.                 return;
  174.             }
  175.  
  176.             if (result == AppStrings.Edit)
  177.             {
  178.                 await EditAsync(orderItemViewModel);
  179.             }
  180.         }
  181.  
  182.         private async Task EditAsync(OrderItemViewModel orderItemViewModel)
  183.         {
  184.             var employeesIds = orderItemViewModel.Order.Executors.Select(executor => executor.EmployeeId).ToArray();
  185.             var workIds = orderItemViewModel.Order.ListOfWork
  186.                 .Where(work => work.NomenclatureId.HasValue)
  187.                 .Select(work => work.NomenclatureId!.Value)
  188.                 .ToArray();
  189.  
  190.             var getEmployeesTask = employeesManager.GetEmployeesByIdsAsync(employeesIds);
  191.             var getWorksTask = nomenclatureManager.GetWorksByNumenclatureIdsAsync(workIds, CancellationToken.None);
  192.  
  193.             await Task.WhenAll(getEmployeesTask, getWorksTask);
  194.  
  195.             if (!getEmployeesTask.Result.IsSuccessful ||
  196.                 !getWorksTask.Result.IsSuccessful)
  197.             {
  198.                 return;
  199.             }
  200.  
  201.             var employeeExecutorMappings = getEmployeesTask.Result.Data
  202.             .Join(
  203.                 orderItemViewModel.Order.Executors,
  204.                 employee => employee.Id,
  205.                 executor => executor.EmployeeId,
  206.                 (employee, executor) => new { employee, executor })
  207.             .ToDictionary(kv => kv.employee, kv => kv.executor);
  208.  
  209.             var worksMappings = getWorksTask.Result.Data
  210.             .Join(
  211.                 orderItemViewModel.Order.ListOfWork,
  212.                 work => work.Id,
  213.                 orderWork => orderWork.NomenclatureId,
  214.                 (work, orderWork) => new { work, orderWork })
  215.             .ToDictionary(kv => kv.work, kv => kv.orderWork);
  216.  
  217.             var navigationParams = OrderSaveNavigationParams.Edit(
  218.                 orderItemViewModel.Order,
  219.                 employeeExecutorMappings,
  220.                 worksMappings);
  221.  
  222.             var updatedOrder = await NavigationManager.NavigateAsync<OrderSaveViewModel, OrderSaveNavigationParams, Order?>(navigationParams);
  223.             orderItemViewModel.UpdateOrder(updatedOrder!);
  224.         }
  225.  
  226.         private void OnAnyItemIsSelectedChanged(OrderItemViewModel itemViewModel)
  227.         {
  228.             if (!IsSelectionMode)
  229.             {
  230.                 return;
  231.             }
  232.  
  233.             if (itemViewModel.IsSelected)
  234.             {
  235.                 SelectedItemsCount++;
  236.                 return;
  237.             }
  238.  
  239.             SelectedItemsCount--;
  240.         }
  241.  
  242.         private async Task DeleteOrdersAsync()
  243.         {
  244.             var selectedItems = Items
  245.                 .OfType<OrderItemViewModel>()
  246.                 .Where(item => item.IsSelected)
  247.                 .ToArray();
  248.                
  249.             var selectedItemsIds = selectedItems
  250.                 .Select(item => item.Order.Id)
  251.                 .ToArray();
  252.  
  253.             var response = await ordersManager.DeleteAsync(selectedItemsIds, CancellationToken.None);
  254.             if (response.IsSuccessful)
  255.             {
  256.                 Items.RemoveItems(selectedItems);
  257.             }
  258.  
  259.             Cancel();
  260.         }
  261.  
  262.         private void OnIsSelectionModeChanged()
  263.         {
  264.             Items.OfType<OrderItemViewModel>().ForEach(item => item.IsSelectionMode = IsSelectionMode);
  265.         }
  266.  
  267.         private async Task AddOrderAsync()
  268.         {
  269.             var order = await NavigationManager.NavigateAsync<OrderSaveViewModel, OrderSaveNavigationParams, Order?>(OrderSaveNavigationParams.Add());
  270.             if (order is null)
  271.             {
  272.                 return;
  273.             }
  274.  
  275.             await RefreshDataAsync();
  276.         }
  277.  
  278.         private SelectableItemViewModel<OrdersFilterMode>[] CreateItems(OrdersFilterMode selectedMode)
  279.         {
  280.             var values = Enum.GetValues(typeof(OrdersFilterMode)).Cast<OrdersFilterMode>().ToList();
  281.             if (userSession.User!.UserRole == UserRole.Client)
  282.             {
  283.                 values.Remove(OrdersFilterMode.OnlyMy);
  284.             }
  285.  
  286.             return values
  287.                 .Select(mode => new SelectableItemViewModel<OrdersFilterMode>(mode, mode.ToLocalizedString(), mode == selectedMode))
  288.                 .ToArray();
  289.         }
  290.  
  291.         private Task FilterItemSelected(SelectableItemViewModel<OrdersFilterMode> itemViewModel)
  292.         {
  293.             FiltersItems.ForEach(item => item.IsSelected = item == itemViewModel);
  294.  
  295.             return RefreshDataAsync();
  296.         }
  297.  
  298.         private void Cancel()
  299.         {
  300.             IsSelectionMode = false;
  301.             SelectedItemsCount = 0;
  302.             Items.OfType<OrderItemViewModel>().ForEach(item => item.IsSelected = false);
  303.         }
  304.  
  305.         private Task GoToFeedAsync() =>
  306.             NavigationManager.NavigateAsync<FeedViewModel>();
  307.  
  308.         private Task GoToContactsAsync() =>
  309.             NavigationManager.NavigateAsync<ContactsViewModel>();
  310.  
  311.         private string GetItemsCount()
  312.         {
  313.             if (IsAnyItemSelect)
  314.             {
  315.                 return string.Format(AppStrings.SelectTemplate, SelectedItemsCount);
  316.             }
  317.  
  318.             return AppStrings.SelectOrder;
  319.         }
  320.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement