using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
using Tango.Core.DI;
using Tango.Core.Helpers;
using Tango.FSE.Common;
using Tango.FSE.Common.AutoComplete;
using Tango.FSE.Common.BugReporting;
using Tango.FSE.Common.Notifications;
using Tango.FSE.Common.Storage;
using Tango.TFS;
namespace Tango.FSE.UI.Dialogs
{
public class BugReportFullViewVM : BugReportViewVM
{
[TangoInject]
private INotificationProvider NotificationProvider { get; set; }
[TangoInject]
private IStorageProvider StorageProvider { get; set; }
public List Areas { get; set; }
private Area _area;
[Required(ErrorMessage = "Area is required")]
public Area Area
{
get { return _area; }
set { _area = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
}
public List TeamMembers { get; set; }
public AutoCompleteSource TeamMembersAutoComplete { get; set; }
private TeamMember _assignedTo;
[Required(ErrorMessage = "Assigned To is required")]
public TeamMember AssignedTo
{
get { return _assignedTo; }
set { _assignedTo = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
}
private String _stepsToReproduce;
public String StepsToReproduce
{
get { return _stepsToReproduce; }
set { _stepsToReproduce = value; RaisePropertyChangedAuto(); }
}
public ObservableCollection Attachments { get; set; }
public ObservableCollection SelectedAttachements { get; set; }
public RelayCommand AddAttachementCommand { get; set; }
public RelayCommand RemoveSelectedAttachementsCommand { get; set; }
public BugReportFullViewVM() : base()
{
Attachments = new ObservableCollection();
SelectedAttachements = new ObservableCollection();
SelectedAttachements.CollectionChanged += (_, __) => InvalidateRelayCommands();
TeamMembersAutoComplete = new AutoCompleteSource(FilterTeamMembers);
AddAttachementCommand = new RelayCommand(AddAttachement);
RemoveSelectedAttachementsCommand = new RelayCommand(RemoveSelectedAttachements, () => SelectedAttachements.Count > 0);
}
public BugReportFullViewVM(Bug bug) : this()
{
if (bug != null)
{
Bug = bug;
Title = Bug.Title;
Description = Bug.Description;
}
}
private List FilterTeamMembers(string filter)
{
if (TeamMembers != null)
{
return TeamMembers.Where(x => String.IsNullOrWhiteSpace(filter) || x.DisplayName.ToLower().Contains(filter.ToLower())).ToList();
}
return new List();
}
private async void AddAttachement()
{
var result = await StorageProvider.OpenFiles("Select file/s to attach");
if (result.Confirmed)
{
foreach (var file in result.SelectedItems)
{
String fileName = Path.GetFileName(file);
if (new FileInfo(file).Length > 1000000 * 60) // 60MB limit
{
await NotificationProvider.ShowError($"The size of '{fileName}' exceeds the maximum 60 MB limit.");
continue;
}
Attachments.Add(new BugAttachement()
{
Name = fileName,
File = file,
Description = fileName
});
}
InvalidateRelayCommands();
}
}
private void RemoveSelectedAttachements()
{
foreach (var attachement in SelectedAttachements.ToList())
{
Attachments.Remove(attachement);
}
SelectedAttachements.Clear();
InvalidateRelayCommands();
}
protected override void Accept()
{
if (Validate())
{
Bug.Title = Title;
Bug.Description = Description;
Bug.Comments = Comments;
Bug.StepsToReproduce = StepsToReproduce;
Bug.AssignedTo = AssignedTo;
Bug.Area = Area;
Bug.Attachments = Attachments.ToList();
base.Accept();
}
}
}
}