Skip to content
This repository was archived by the owner on Oct 3, 2022. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified .vs/TakeMyTime.NETCore/DesignTimeBuild/.dtbcache
Binary file not shown.
Binary file modified .vs/TakeMyTime.NETCore/v16/.suo
Binary file not shown.
4 changes: 2 additions & 2 deletions TakeMyTime.BLL/Logic/StatisticsLogic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ public StatisticsLogic(UnitOfWork uow = null)
}
}

public Dictionary<string, double> GetAssignmentSharesOfProject(int project_id)
public IEnumerable<Tuple<int, string, double>> GetAssignmentSharesOfProject(int project_id)
{
return this.unitOfWork.Statistics.GetAssignmentSharesOfProject(project_id);
}

public Dictionary<string, double> GetProjectShares()
public IEnumerable<Tuple<int, string, double>> GetProjectShares()
{
return this.unitOfWork.Statistics.GetProjectTotalShares();
}
Expand Down
17 changes: 10 additions & 7 deletions TakeMyTime.Common/Enums/EnumDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,23 @@ public class EnumDefinition
/// <summary>
/// Status of assignments
/// </summary>
[Flags]
public enum AssignmentStatus
{
[Description("All")]
Default = ~0,
[Description("Active")]
InProgress = 0,
[Description("None")]
None = 0,
[Description("Future")]
Future = 1,
[Description("Active")]
InProgress = 2,
[Description("Done")]
Done = 2,
Done = 4,
[Description("Aborted")]
Aborted = 3,
Aborted = 8,
[Description("Postponed")]
Postponed = 4,
Postponed = 16,
[Description("All")]
All = ~0
}

public enum TimekeeperStatus
Expand Down
4 changes: 2 additions & 2 deletions TakeMyTime.DAL/Interfaces/IStatisticsRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ public interface IStatisticsRepository
{
long? GetTotalWorktimeOfAllActiveProjects();
long? GetTotalWorktimeOfSpecificProject(int project_id);
Dictionary<string, double> GetAssignmentSharesOfProject(int project_id);
Dictionary<string, double> GetProjectTotalShares();
IEnumerable<Tuple<int, string, double>> GetAssignmentSharesOfProject(int project_id);
IEnumerable<Tuple<int, string, double>> GetProjectTotalShares();
IEnumerable<ProductivityViewModel> GetProjectProductiveDays(int project_id);
IEnumerable<MostProductiveWeekDaysViewModel> GetMostProductiveDays();
}
Expand Down
12 changes: 6 additions & 6 deletions TakeMyTime.DAL/Repositories/StatisticsRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ public StatisticsRepository(TakeMyTimeDbContext context)
this.context = context;
}

public Dictionary<string, double> GetAssignmentSharesOfProject(int project_id)
public IEnumerable<Tuple<int, string, double>> GetAssignmentSharesOfProject(int project_id)
{
var results = new Dictionary<string, double>();
var results = new List<Tuple<int, string, double>>();
var assignmentsOfProject = this.context.Assignments
.Include(a => a.Subtasks)
.Where(a => a.Project_Id == project_id);
Expand All @@ -34,7 +34,7 @@ public Dictionary<string, double> GetAssignmentSharesOfProject(int project_id)
if (workingTimeForAssignment > 0)
{
double shareOfAssignment = Math.Round(((double)workingTimeForAssignment / (double)totalWorkingTime * 100), 2);
results.Add(ass.Name, shareOfAssignment);
results.Add(Tuple.Create(ass.Id, ass.Name, shareOfAssignment));
}
}
}
Expand Down Expand Up @@ -66,9 +66,9 @@ public Dictionary<string, double> GetAssignmentSharesOfProject(int project_id)
.Sum(e => e.DurationAsTicks);
}

public Dictionary<string, double> GetProjectTotalShares()
public IEnumerable<Tuple<int, string, double>> GetProjectTotalShares()
{
var results = new Dictionary<string, double>();
var results = new List<Tuple<int, string, double>>();
var projects = this.context.Projects.Where(p => p.ProjectStatus == EnumDefinition.ProjectStatus.Active);
var worktimeOfAllProjects = GetTotalWorktimeOfAllActiveProjects();
if (worktimeOfAllProjects > 0)
Expand All @@ -79,7 +79,7 @@ public Dictionary<string, double> GetProjectTotalShares()
if (worktimeOfProject > 0)
{
double shareOfProject = Math.Round(((double)worktimeOfProject / (double)worktimeOfAllProjects * 100), 2);
results.Add(project.Name, shareOfProject);
results.Add(Tuple.Create(project.Id, project.Name, shareOfProject));
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions TakeMyTime.DAL/TakeMyTimeDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public TakeMyTimeDbContext() : base()
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// var connectionString = ConfigurationManager.ConnectionStrings["TakeMyTimeDebug"];
optionsBuilder.UseSqlite("Data Source=TakeMyTimeDebug.db;");
optionsBuilder.UseSqlite(ConfigurationManager.ConnectionStrings["TakeMyTimeDebug"].ConnectionString);
optionsBuilder.EnableSensitiveDataLogging(true);
}

Expand Down Expand Up @@ -60,7 +60,7 @@ public TakeMyTimeDbContext() : base()

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite(ConfigurationManager.ConnectionStrings["TakeMyTime"].ConnectionString);
optionsBuilder.UseSqlite(ConfigurationManager.ConnectionStrings["TakeMyTimeDebug"].ConnectionString);
}
#endif

Expand Down
1 change: 1 addition & 0 deletions TakeMyTime.Models/Models/Assignment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public void Init(string name,
this.Project_Id = project.Id;
this.DurationPlannedAsTicks = durationPlannedAsTicks;
this.Subtasks = new HashSet<Subtask>();
this.AssignmentStatus = AssignmentStatus.Future;
this.SetCreated();
}

Expand Down
2 changes: 1 addition & 1 deletion TakeMyTime.WPF/Assignments/AssignmentOverview.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@
Margin="0 8 10 0"></Label>
<ComboBox
x:Name="cb_StatusFilter"
IsEditable="False"
Width="140"
Margin="0 0 30 0"
HorizontalAlignment="Left"
SelectionChanged="cb_StatusFilter_SelectionChanged"
IsEditable="False"
>
<ComboBoxItem Content="{x:Static resources:Shared.AssignmentAll}" x:Name="cbi_All"></ComboBoxItem>
<ComboBoxItem Content="{x:Static resources:Shared.AssignmentActive}" x:Name="cbi_Active"></ComboBoxItem>
Expand Down
139 changes: 58 additions & 81 deletions TakeMyTime.WPF/Assignments/AssignmentOverview.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,19 @@ public partial class AssignmentOverview : Page
{
public AssignmentOverview()
{
const int DEFAULT_PAGE_SIZE = 15;
InitializeComponent();
this.PagingManager = new PagingManager<AssignmentViewModel>(15);
this.PagingManager = new PagingManager<AssignmentViewModel>(DEFAULT_PAGE_SIZE);
this.LoadProjectViewModels();
this.Load();
this.RefreshBindings(1);
this.SetDefaultFilters();
}

private void SetDefaultFilters()
{
this.cb_ProjectSelection.SelectedItem = this.ProjectViewModels.Single(pvm => pvm.Id == 0);
this.cb_StatusFilter.SelectedItem = cbi_Future;
}

private void LoadProjectViewModels()
Expand All @@ -53,17 +61,8 @@ private void Load()
{
var assignmentLogic = new AssignmentLogic();
this.AssignmentViewModels = assignmentLogic.GetAllAssignments().Select(a => new AssignmentViewModel(a));
this.FilteredAssignmentViewModels = PipeThroughFilter(this.AssignmentViewModels);
assignmentLogic.Dispose();
if (this.SelectedProject != null)
{
this.FilteredAssignmentViewModels = this.AssignmentViewModels
.Where(av => av.ProjectId == this.SelectedProject?.Id && av.StatusAsEnum == this.SelectedFilter)
.ToList();
}
else
{
this.FilteredAssignmentViewModels = this.AssignmentViewModels;
}
this.PagingManager.Data = this.FilteredAssignmentViewModels.ToList();
this.LoadFromAllProjects = true;
this.lv_Assignments.ItemsSource = this.PagingManager.Page(this.PagingManager.CurrentPage);
Expand All @@ -75,14 +74,31 @@ private void Load()

private void RefreshBindings(int page)
{
this.PagingManager.Data = this.FilteredAssignmentViewModels.ToList();
this.PagingManager.Data = PipeThroughFilter(this.AssignmentViewModels).ToList();
this.lv_Assignments.ItemsSource = this.PagingManager.Page(page);
this.btn_CurrentPage.Content = this.PagingManager.CurrentPage;
this.btn_allPages.Content = this.PagingManager.MaxPage;
this.btn_PagingForward.IsEnabled = this.PagingManager.CanPageForward;
this.btn_PagingBack.IsEnabled = this.PagingManager.CanPageBack;
}

private IEnumerable<AssignmentViewModel> PipeThroughFilter(IEnumerable<AssignmentViewModel> viewModels)
{
return viewModels.Where(GetFilterCondition()).ToList();
}

private Func<AssignmentViewModel, bool> GetFilterCondition()
{
Func<AssignmentViewModel, bool> filterByProject = fav => fav.ProjectId == this.SelectedProject.Id;
Func<AssignmentViewModel, bool> filterByStatus = fav => this.SelectedFilter.HasFlag(fav.StatusAsEnum);
Func<AssignmentViewModel, bool> finalCondition = fav => filterByStatus(fav); ;
if (this.SelectedProject != null && this.SelectedProject.Id > 0)
{
finalCondition = fav => filterByProject(fav) && filterByStatus(fav);
}
return finalCondition;
}

private void btn_NewAssignment_Click(object sender, RoutedEventArgs e)
{
ShowAddAssignmentDialog(false);
Expand All @@ -92,7 +108,10 @@ private void ShowAddAssignmentDialog(bool editMode)
{
AddAssignment addAssignmentWindow = null;
var projectLogic = new ProjectLogic();
var project = projectLogic.GetProjectById(this.SelectedProject.Id);
int? projectId = null;
if (this.SelectedProject != null) projectId = this.SelectedProject.Id;
if (this.SelectedAssignment != null) projectId = this.SelectedAssignment.ProjectId;
var project = projectLogic.GetProjectById(projectId.Value);
projectLogic.Dispose();

if (editMode)
Expand Down Expand Up @@ -168,68 +187,26 @@ private void btn_SetAborted_Click(object sender, RoutedEventArgs e)
}
}

[Refactor]
private void cb_ProjectSelection_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count > 0)
{
this.SelectedProject = e.AddedItems[0] as Projects.ProjectViewModel;
if (this.SelectedProject.Id != 0 && this.SelectedFilter != EnumDefinition.AssignmentStatus.Default)
{
this.FilteredAssignmentViewModels = this.FilteredAssignmentViewModels
.Where(avm => avm.ProjectId == SelectedProject.Id && avm.StatusAsEnum == this.SelectedFilter);
this.LoadFromAllProjects = false;
}
else if (this.SelectedProject.Id == 0 && this.SelectedFilter != EnumDefinition.AssignmentStatus.Default)
{
this.FilteredAssignmentViewModels = this.AssignmentViewModels.Where(avm => avm.StatusAsEnum == this.SelectedFilter); ;
this.LoadFromAllProjects = true;
}
else if (this.SelectedProject.Id != 0 && this.SelectedFilter == EnumDefinition.AssignmentStatus.Default)
{
this.FilteredAssignmentViewModels = this.AssignmentViewModels.Where(avm => avm.ProjectId == this.SelectedProject.Id);
}
else if (this.SelectedProject.Id == 0 && this.SelectedFilter == EnumDefinition.AssignmentStatus.Default)
{
this.FilteredAssignmentViewModels = this.AssignmentViewModels;
}
}

this.btn_NewAssignment.IsEnabled = this.SelectedProject != null && this.SelectedProject.Id != 0;
RefreshBindings(this.PagingManager.CurrentPage);
}

[Refactor]
private void cb_StatusFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.AddedItems.Count == 0 || this.SelectedProject == null)
{
this.FilteredAssignmentViewModels = this.AssignmentViewModels;
return;
this.SelectedFilter = EnumDefinition.AssignmentStatus.All;
}
else
{
var selectedFilter = GetStatusByItemName(((e.AddedItems[0] as ComboBoxItem).Name));
if (selectedFilter != EnumDefinition.AssignmentStatus.Default && SelectedProject.Id != 0)
{
this.FilteredAssignmentViewModels = this.AssignmentViewModels
.Where(avm => avm.StatusAsEnum == selectedFilter &&
avm.ProjectId == SelectedProject.Id);
}
else if (selectedFilter == EnumDefinition.AssignmentStatus.Default && !this.LoadFromAllProjects)
{
this.FilteredAssignmentViewModels = this.AssignmentViewModels
.Where(avm => avm.ProjectId == SelectedProject.Id);
}
else if (selectedFilter == EnumDefinition.AssignmentStatus.Default && this.LoadFromAllProjects)
{
this.FilteredAssignmentViewModels = this.AssignmentViewModels;
}
else
{
this.FilteredAssignmentViewModels = this.AssignmentViewModels
.Where(avm => avm.StatusAsEnum == selectedFilter);
}
var selectedFilter = GetStatusByItemName((e.AddedItems[0] as ComboBoxItem).Name);
this.SelectedFilter = selectedFilter;
}
RefreshBindings(this.PagingManager.CurrentPage);
Expand Down Expand Up @@ -273,7 +250,7 @@ private void btn_DeleteAssignment_Click(object sender, RoutedEventArgs e)
catch (Exception ex)
{
Logger.LogException(ex);
}
}
}
}

Expand All @@ -291,44 +268,44 @@ private void btn_PagingForward_Click(object sender, RoutedEventArgs e)

#region Utility

private EnumDefinition.AssignmentStatus GetStatusByItemName(string itemName)
private EnumDefinition.AssignmentStatus GetStatusByItemName(string item)
{
return itemName switch
return item switch
{
"cbi_All" => EnumDefinition.AssignmentStatus.Default,
"cbi_All" => EnumDefinition.AssignmentStatus.All,
"cbi_Active" => EnumDefinition.AssignmentStatus.InProgress,
"cbi_Future" => EnumDefinition.AssignmentStatus.Future,
"cbi_Done" => EnumDefinition.AssignmentStatus.Done,
"cbi_Aborted" => EnumDefinition.AssignmentStatus.Aborted,
"cbi_Postponed" => EnumDefinition.AssignmentStatus.Postponed,
_ => EnumDefinition.AssignmentStatus.Default
_ => EnumDefinition.AssignmentStatus.None
};
}

private void ShowErrorOnStatusChangeDialog()
{
string title = ResourceStringManager.GetResourceByKey("CannotSetDoneOrAbortedErrorTitle");
string message = ResourceStringManager.GetResourceByKey("CannotSetDoneErrorMessage");
MessageBox.Show(message, title, MessageBoxButton.OK, MessageBoxImage.Error);
}
private void ShowErrorOnStatusChangeDialog()
{
string title = ResourceStringManager.GetResourceByKey("CannotSetDoneOrAbortedErrorTitle");
string message = ResourceStringManager.GetResourceByKey("CannotSetDoneErrorMessage");
MessageBox.Show(message, title, MessageBoxButton.OK, MessageBoxImage.Error);
}

#endregion
#endregion

#region Properties
#region Properties

public List<Projects.ProjectViewModel> ProjectViewModels { get; set; }
public IEnumerable<AssignmentViewModel> AssignmentViewModels { get; set; }
public IEnumerable<AssignmentViewModel> FilteredAssignmentViewModels { get; set; }
public EnumDefinition.AssignmentStatus SelectedFilter { get; set; }
public Projects.ProjectViewModel SelectedProject { get; set; }
public AssignmentViewModel SelectedAssignment { get; set; }
public bool LoadFromAllProjects { get; set; }
public PagingManager<AssignmentViewModel> PagingManager { get; set; }
public List<Projects.ProjectViewModel> ProjectViewModels { get; set; }
public IEnumerable<AssignmentViewModel> AssignmentViewModels { get; set; }
public IEnumerable<AssignmentViewModel> FilteredAssignmentViewModels { get; set; }
public EnumDefinition.AssignmentStatus SelectedFilter { get; set; }
public Projects.ProjectViewModel SelectedProject { get; set; }
public AssignmentViewModel SelectedAssignment { get; set; }
public bool LoadFromAllProjects { get; set; }
public PagingManager<AssignmentViewModel> PagingManager { get; set; }



#endregion
#endregion

}

}
}
4 changes: 2 additions & 2 deletions TakeMyTime.WPF/Assignments/AssignmentViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ private Uri GetImageByStatus(EnumDefinition.AssignmentStatus status)
{
EnumDefinition.AssignmentStatus.InProgress => new Uri("pack://application:,,,/Images/assignmentActiveIconSmall.png"),
EnumDefinition.AssignmentStatus.Future => new Uri("pack://application:,,,/Images/assignmentFutureIconSmall.png"),
EnumDefinition.AssignmentStatus.Default => new Uri("pack://application:,,,/Images/assignmentActiveIconSmall.png"),
EnumDefinition.AssignmentStatus.None => new Uri("pack://application:,,,/Images/assignmentActiveIconSmall.png"),
EnumDefinition.AssignmentStatus.Aborted => new Uri("pack://application:,,,/Images/assignmentAbortedIconSmall.png"),
EnumDefinition.AssignmentStatus.Postponed => new Uri("pack://application:,,,/Images/assignmentPostponedIconSmall.png"),
EnumDefinition.AssignmentStatus.Done => new Uri("pack://application:,,,/Images/assignmentDoneIconSmall.png"),
Expand All @@ -73,7 +73,7 @@ private string GetStatusString(EnumDefinition.AssignmentStatus statusAsEnum)
{
EnumDefinition.AssignmentStatus.InProgress => Resources.Shared.AssignmentActive,
EnumDefinition.AssignmentStatus.Future => Resources.Shared.AssignmentFuture,
EnumDefinition.AssignmentStatus.Default => Resources.Shared.AssignmentFuture,
EnumDefinition.AssignmentStatus.None => Resources.Shared.AssignmentFuture,
EnumDefinition.AssignmentStatus.Aborted => Resources.Shared.AssignmentAborted,
EnumDefinition.AssignmentStatus.Postponed => Resources.Shared.AssignmentPostponed,
_ => null
Expand Down
Loading