Skip to content
This repository was archived by the owner on Oct 3, 2022. It is now read-only.

Commit ec1c3e7

Browse files
author
SimplementsBinder
committed
Fixed crashes and dashboard bug
1 parent 5a0cc16 commit ec1c3e7

File tree

12 files changed

+90
-109
lines changed

12 files changed

+90
-109
lines changed
0 Bytes
Binary file not shown.

.vs/TakeMyTime.NETCore/v16/.suo

6 KB
Binary file not shown.

TakeMyTime.BLL/Logic/StatisticsLogic.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,12 @@ public StatisticsLogic(UnitOfWork uow = null)
2727
}
2828
}
2929

30-
public Dictionary<string, double> GetAssignmentSharesOfProject(int project_id)
30+
public IEnumerable<Tuple<int, string, double>> GetAssignmentSharesOfProject(int project_id)
3131
{
3232
return this.unitOfWork.Statistics.GetAssignmentSharesOfProject(project_id);
3333
}
3434

35-
public Dictionary<string, double> GetProjectShares()
35+
public IEnumerable<Tuple<int, string, double>> GetProjectShares()
3636
{
3737
return this.unitOfWork.Statistics.GetProjectTotalShares();
3838
}

TakeMyTime.Common/Enums/EnumDefinition.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,23 @@ public class EnumDefinition
1515
/// <summary>
1616
/// Status of assignments
1717
/// </summary>
18+
[Flags]
1819
public enum AssignmentStatus
1920
{
20-
[Description("All")]
21-
Default = ~0,
22-
[Description("Active")]
23-
InProgress = 0,
21+
[Description("None")]
22+
None = 0,
2423
[Description("Future")]
2524
Future = 1,
25+
[Description("Active")]
26+
InProgress = 2,
2627
[Description("Done")]
27-
Done = 2,
28+
Done = 4,
2829
[Description("Aborted")]
29-
Aborted = 3,
30+
Aborted = 8,
3031
[Description("Postponed")]
31-
Postponed = 4,
32+
Postponed = 16,
33+
[Description("All")]
34+
All = ~0
3235
}
3336

3437
public enum TimekeeperStatus

TakeMyTime.DAL/Interfaces/IStatisticsRepository.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ public interface IStatisticsRepository
99
{
1010
long? GetTotalWorktimeOfAllActiveProjects();
1111
long? GetTotalWorktimeOfSpecificProject(int project_id);
12-
Dictionary<string, double> GetAssignmentSharesOfProject(int project_id);
13-
Dictionary<string, double> GetProjectTotalShares();
12+
IEnumerable<Tuple<int, string, double>> GetAssignmentSharesOfProject(int project_id);
13+
IEnumerable<Tuple<int, string, double>> GetProjectTotalShares();
1414
IEnumerable<ProductivityViewModel> GetProjectProductiveDays(int project_id);
1515
IEnumerable<MostProductiveWeekDaysViewModel> GetMostProductiveDays();
1616
}

TakeMyTime.DAL/Repositories/StatisticsRepository.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ public StatisticsRepository(TakeMyTimeDbContext context)
1818
this.context = context;
1919
}
2020

21-
public Dictionary<string, double> GetAssignmentSharesOfProject(int project_id)
21+
public IEnumerable<Tuple<int, string, double>> GetAssignmentSharesOfProject(int project_id)
2222
{
23-
var results = new Dictionary<string, double>();
23+
var results = new List<Tuple<int, string, double>>();
2424
var assignmentsOfProject = this.context.Assignments
2525
.Include(a => a.Subtasks)
2626
.Where(a => a.Project_Id == project_id);
@@ -34,7 +34,7 @@ public Dictionary<string, double> GetAssignmentSharesOfProject(int project_id)
3434
if (workingTimeForAssignment > 0)
3535
{
3636
double shareOfAssignment = Math.Round(((double)workingTimeForAssignment / (double)totalWorkingTime * 100), 2);
37-
results.Add(ass.Name, shareOfAssignment);
37+
results.Add(Tuple.Create(ass.Id, ass.Name, shareOfAssignment));
3838
}
3939
}
4040
}
@@ -66,9 +66,9 @@ public Dictionary<string, double> GetAssignmentSharesOfProject(int project_id)
6666
.Sum(e => e.DurationAsTicks);
6767
}
6868

69-
public Dictionary<string, double> GetProjectTotalShares()
69+
public IEnumerable<Tuple<int, string, double>> GetProjectTotalShares()
7070
{
71-
var results = new Dictionary<string, double>();
71+
var results = new List<Tuple<int, string, double>>();
7272
var projects = this.context.Projects.Where(p => p.ProjectStatus == EnumDefinition.ProjectStatus.Active);
7373
var worktimeOfAllProjects = GetTotalWorktimeOfAllActiveProjects();
7474
if (worktimeOfAllProjects > 0)
@@ -79,7 +79,7 @@ public Dictionary<string, double> GetProjectTotalShares()
7979
if (worktimeOfProject > 0)
8080
{
8181
double shareOfProject = Math.Round(((double)worktimeOfProject / (double)worktimeOfAllProjects * 100), 2);
82-
results.Add(project.Name, shareOfProject);
82+
results.Add(Tuple.Create(project.Id, project.Name, shareOfProject));
8383
}
8484
}
8585
}

TakeMyTime.DAL/TakeMyTimeDbContext.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public TakeMyTimeDbContext() : base()
1717
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
1818
{
1919
// var connectionString = ConfigurationManager.ConnectionStrings["TakeMyTimeDebug"];
20-
optionsBuilder.UseSqlite("Data Source=TakeMyTimeDebug.db;");
20+
optionsBuilder.UseSqlite(ConfigurationManager.ConnectionStrings["TakeMyTimeDebug"].ConnectionString);
2121
optionsBuilder.EnableSensitiveDataLogging(true);
2222
}
2323

@@ -60,7 +60,7 @@ public TakeMyTimeDbContext() : base()
6060

6161
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
6262
{
63-
optionsBuilder.UseSqlite(ConfigurationManager.ConnectionStrings["TakeMyTime"].ConnectionString);
63+
optionsBuilder.UseSqlite(ConfigurationManager.ConnectionStrings["TakeMyTimeDebug"].ConnectionString);
6464
}
6565
#endif
6666

TakeMyTime.Models/Models/Assignment.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public void Init(string name,
3636
this.Project_Id = project.Id;
3737
this.DurationPlannedAsTicks = durationPlannedAsTicks;
3838
this.Subtasks = new HashSet<Subtask>();
39+
this.AssignmentStatus = AssignmentStatus.Future;
3940
this.SetCreated();
4041
}
4142

TakeMyTime.WPF/Assignments/AssignmentOverview.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@
3232
Margin="0 8 10 0"></Label>
3333
<ComboBox
3434
x:Name="cb_StatusFilter"
35-
IsEditable="False"
3635
Width="140"
3736
Margin="0 0 30 0"
3837
HorizontalAlignment="Left"
3938
SelectionChanged="cb_StatusFilter_SelectionChanged"
39+
IsEditable="False"
4040
>
4141
<ComboBoxItem Content="{x:Static resources:Shared.AssignmentAll}" x:Name="cbi_All"></ComboBoxItem>
4242
<ComboBoxItem Content="{x:Static resources:Shared.AssignmentActive}" x:Name="cbi_Active"></ComboBoxItem>

TakeMyTime.WPF/Assignments/AssignmentOverview.xaml.cs

Lines changed: 58 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,19 @@ public partial class AssignmentOverview : Page
3030
{
3131
public AssignmentOverview()
3232
{
33+
const int DEFAULT_PAGE_SIZE = 15;
3334
InitializeComponent();
34-
this.PagingManager = new PagingManager<AssignmentViewModel>(15);
35+
this.PagingManager = new PagingManager<AssignmentViewModel>(DEFAULT_PAGE_SIZE);
3536
this.LoadProjectViewModels();
3637
this.Load();
3738
this.RefreshBindings(1);
39+
this.SetDefaultFilters();
40+
}
41+
42+
private void SetDefaultFilters()
43+
{
44+
this.cb_ProjectSelection.SelectedItem = this.ProjectViewModels.Single(pvm => pvm.Id == 0);
45+
this.cb_StatusFilter.SelectedItem = cbi_Future;
3846
}
3947

4048
private void LoadProjectViewModels()
@@ -53,17 +61,8 @@ private void Load()
5361
{
5462
var assignmentLogic = new AssignmentLogic();
5563
this.AssignmentViewModels = assignmentLogic.GetAllAssignments().Select(a => new AssignmentViewModel(a));
64+
this.FilteredAssignmentViewModels = PipeThroughFilter(this.AssignmentViewModels);
5665
assignmentLogic.Dispose();
57-
if (this.SelectedProject != null)
58-
{
59-
this.FilteredAssignmentViewModels = this.AssignmentViewModels
60-
.Where(av => av.ProjectId == this.SelectedProject?.Id && av.StatusAsEnum == this.SelectedFilter)
61-
.ToList();
62-
}
63-
else
64-
{
65-
this.FilteredAssignmentViewModels = this.AssignmentViewModels;
66-
}
6766
this.PagingManager.Data = this.FilteredAssignmentViewModels.ToList();
6867
this.LoadFromAllProjects = true;
6968
this.lv_Assignments.ItemsSource = this.PagingManager.Page(this.PagingManager.CurrentPage);
@@ -75,14 +74,31 @@ private void Load()
7574

7675
private void RefreshBindings(int page)
7776
{
78-
this.PagingManager.Data = this.FilteredAssignmentViewModels.ToList();
77+
this.PagingManager.Data = PipeThroughFilter(this.AssignmentViewModels).ToList();
7978
this.lv_Assignments.ItemsSource = this.PagingManager.Page(page);
8079
this.btn_CurrentPage.Content = this.PagingManager.CurrentPage;
8180
this.btn_allPages.Content = this.PagingManager.MaxPage;
8281
this.btn_PagingForward.IsEnabled = this.PagingManager.CanPageForward;
8382
this.btn_PagingBack.IsEnabled = this.PagingManager.CanPageBack;
8483
}
8584

85+
private IEnumerable<AssignmentViewModel> PipeThroughFilter(IEnumerable<AssignmentViewModel> viewModels)
86+
{
87+
return viewModels.Where(GetFilterCondition()).ToList();
88+
}
89+
90+
private Func<AssignmentViewModel, bool> GetFilterCondition()
91+
{
92+
Func<AssignmentViewModel, bool> filterByProject = fav => fav.ProjectId == this.SelectedProject.Id;
93+
Func<AssignmentViewModel, bool> filterByStatus = fav => this.SelectedFilter.HasFlag(fav.StatusAsEnum);
94+
Func<AssignmentViewModel, bool> finalCondition = fav => filterByStatus(fav); ;
95+
if (this.SelectedProject != null && this.SelectedProject.Id > 0)
96+
{
97+
finalCondition = fav => filterByProject(fav) && filterByStatus(fav);
98+
}
99+
return finalCondition;
100+
}
101+
86102
private void btn_NewAssignment_Click(object sender, RoutedEventArgs e)
87103
{
88104
ShowAddAssignmentDialog(false);
@@ -92,7 +108,10 @@ private void ShowAddAssignmentDialog(bool editMode)
92108
{
93109
AddAssignment addAssignmentWindow = null;
94110
var projectLogic = new ProjectLogic();
95-
var project = projectLogic.GetProjectById(this.SelectedProject.Id);
111+
int? projectId = null;
112+
if (this.SelectedProject != null) projectId = this.SelectedProject.Id;
113+
if (this.SelectedAssignment != null) projectId = this.SelectedAssignment.ProjectId;
114+
var project = projectLogic.GetProjectById(projectId.Value);
96115
projectLogic.Dispose();
97116

98117
if (editMode)
@@ -168,68 +187,26 @@ private void btn_SetAborted_Click(object sender, RoutedEventArgs e)
168187
}
169188
}
170189

171-
[Refactor]
172190
private void cb_ProjectSelection_SelectionChanged(object sender, SelectionChangedEventArgs e)
173191
{
174192
if (e.AddedItems.Count > 0)
175193
{
176194
this.SelectedProject = e.AddedItems[0] as Projects.ProjectViewModel;
177-
if (this.SelectedProject.Id != 0 && this.SelectedFilter != EnumDefinition.AssignmentStatus.Default)
178-
{
179-
this.FilteredAssignmentViewModels = this.FilteredAssignmentViewModels
180-
.Where(avm => avm.ProjectId == SelectedProject.Id && avm.StatusAsEnum == this.SelectedFilter);
181-
this.LoadFromAllProjects = false;
182-
}
183-
else if (this.SelectedProject.Id == 0 && this.SelectedFilter != EnumDefinition.AssignmentStatus.Default)
184-
{
185-
this.FilteredAssignmentViewModels = this.AssignmentViewModels.Where(avm => avm.StatusAsEnum == this.SelectedFilter); ;
186-
this.LoadFromAllProjects = true;
187-
}
188-
else if (this.SelectedProject.Id != 0 && this.SelectedFilter == EnumDefinition.AssignmentStatus.Default)
189-
{
190-
this.FilteredAssignmentViewModels = this.AssignmentViewModels.Where(avm => avm.ProjectId == this.SelectedProject.Id);
191-
}
192-
else if (this.SelectedProject.Id == 0 && this.SelectedFilter == EnumDefinition.AssignmentStatus.Default)
193-
{
194-
this.FilteredAssignmentViewModels = this.AssignmentViewModels;
195-
}
196195
}
197196

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

202-
[Refactor]
203201
private void cb_StatusFilter_SelectionChanged(object sender, SelectionChangedEventArgs e)
204202
{
205203
if (e.AddedItems.Count == 0 || this.SelectedProject == null)
206204
{
207-
this.FilteredAssignmentViewModels = this.AssignmentViewModels;
208-
return;
205+
this.SelectedFilter = EnumDefinition.AssignmentStatus.All;
209206
}
210207
else
211208
{
212-
var selectedFilter = GetStatusByItemName(((e.AddedItems[0] as ComboBoxItem).Name));
213-
if (selectedFilter != EnumDefinition.AssignmentStatus.Default && SelectedProject.Id != 0)
214-
{
215-
this.FilteredAssignmentViewModels = this.AssignmentViewModels
216-
.Where(avm => avm.StatusAsEnum == selectedFilter &&
217-
avm.ProjectId == SelectedProject.Id);
218-
}
219-
else if (selectedFilter == EnumDefinition.AssignmentStatus.Default && !this.LoadFromAllProjects)
220-
{
221-
this.FilteredAssignmentViewModels = this.AssignmentViewModels
222-
.Where(avm => avm.ProjectId == SelectedProject.Id);
223-
}
224-
else if (selectedFilter == EnumDefinition.AssignmentStatus.Default && this.LoadFromAllProjects)
225-
{
226-
this.FilteredAssignmentViewModels = this.AssignmentViewModels;
227-
}
228-
else
229-
{
230-
this.FilteredAssignmentViewModels = this.AssignmentViewModels
231-
.Where(avm => avm.StatusAsEnum == selectedFilter);
232-
}
209+
var selectedFilter = GetStatusByItemName((e.AddedItems[0] as ComboBoxItem).Name);
233210
this.SelectedFilter = selectedFilter;
234211
}
235212
RefreshBindings(this.PagingManager.CurrentPage);
@@ -273,7 +250,7 @@ private void btn_DeleteAssignment_Click(object sender, RoutedEventArgs e)
273250
catch (Exception ex)
274251
{
275252
Logger.LogException(ex);
276-
}
253+
}
277254
}
278255
}
279256

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

292269
#region Utility
293270

294-
private EnumDefinition.AssignmentStatus GetStatusByItemName(string itemName)
271+
private EnumDefinition.AssignmentStatus GetStatusByItemName(string item)
295272
{
296-
return itemName switch
273+
return item switch
297274
{
298-
"cbi_All" => EnumDefinition.AssignmentStatus.Default,
275+
"cbi_All" => EnumDefinition.AssignmentStatus.All,
299276
"cbi_Active" => EnumDefinition.AssignmentStatus.InProgress,
300277
"cbi_Future" => EnumDefinition.AssignmentStatus.Future,
301278
"cbi_Done" => EnumDefinition.AssignmentStatus.Done,
302279
"cbi_Aborted" => EnumDefinition.AssignmentStatus.Aborted,
303280
"cbi_Postponed" => EnumDefinition.AssignmentStatus.Postponed,
304-
_ => EnumDefinition.AssignmentStatus.Default
281+
_ => EnumDefinition.AssignmentStatus.None
305282
};
306283
}
307284

308-
private void ShowErrorOnStatusChangeDialog()
309-
{
310-
string title = ResourceStringManager.GetResourceByKey("CannotSetDoneOrAbortedErrorTitle");
311-
string message = ResourceStringManager.GetResourceByKey("CannotSetDoneErrorMessage");
312-
MessageBox.Show(message, title, MessageBoxButton.OK, MessageBoxImage.Error);
313-
}
285+
private void ShowErrorOnStatusChangeDialog()
286+
{
287+
string title = ResourceStringManager.GetResourceByKey("CannotSetDoneOrAbortedErrorTitle");
288+
string message = ResourceStringManager.GetResourceByKey("CannotSetDoneErrorMessage");
289+
MessageBox.Show(message, title, MessageBoxButton.OK, MessageBoxImage.Error);
290+
}
314291

315-
#endregion
292+
#endregion
316293

317-
#region Properties
294+
#region Properties
318295

319-
public List<Projects.ProjectViewModel> ProjectViewModels { get; set; }
320-
public IEnumerable<AssignmentViewModel> AssignmentViewModels { get; set; }
321-
public IEnumerable<AssignmentViewModel> FilteredAssignmentViewModels { get; set; }
322-
public EnumDefinition.AssignmentStatus SelectedFilter { get; set; }
323-
public Projects.ProjectViewModel SelectedProject { get; set; }
324-
public AssignmentViewModel SelectedAssignment { get; set; }
325-
public bool LoadFromAllProjects { get; set; }
326-
public PagingManager<AssignmentViewModel> PagingManager { get; set; }
296+
public List<Projects.ProjectViewModel> ProjectViewModels { get; set; }
297+
public IEnumerable<AssignmentViewModel> AssignmentViewModels { get; set; }
298+
public IEnumerable<AssignmentViewModel> FilteredAssignmentViewModels { get; set; }
299+
public EnumDefinition.AssignmentStatus SelectedFilter { get; set; }
300+
public Projects.ProjectViewModel SelectedProject { get; set; }
301+
public AssignmentViewModel SelectedAssignment { get; set; }
302+
public bool LoadFromAllProjects { get; set; }
303+
public PagingManager<AssignmentViewModel> PagingManager { get; set; }
327304

328305

329306

330-
#endregion
307+
#endregion
331308

332-
333-
}
309+
310+
}
334311
}

0 commit comments

Comments
 (0)