Skip to content

Commit

Permalink
Add Bucket Details with Statistics #20
Browse files Browse the repository at this point in the history
Fix correct number of months shown on Report Page
  • Loading branch information
TheAxelander committed Nov 23, 2022
1 parent 27fa89d commit d235e3a
Show file tree
Hide file tree
Showing 8 changed files with 689 additions and 36 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@
* [Add] Page with reports checking consistency of database data [#3](https://github.com/TheAxelander/OpenBudgeteer/issues/3)
* [Add] Usage of themes from [Bootswatch](https://bootswatch.com) [#101](https://github.com/TheAxelander/OpenBudgeteer/issues/101)
* [Add] Enable MySql User and Database creation via MySql root User [#75](https://github.com/TheAxelander/OpenBudgeteer/issues/75)
* [Add] Bucket Details with Statistics [#20](https://github.com/TheAxelander/OpenBudgeteer/issues/20)
* [Breaking Change] Docker Environment Variable Format [#71](https://github.com/TheAxelander/OpenBudgeteer/issues/71)
* [Changed] Bucket Page: Want, In and Activity figures also now on Bucket Group level [#99](https://github.com/TheAxelander/OpenBudgeteer/issues/99)
* [Changed] Updated Bootstrap to v5.1.3
* [Changed] Replaced Open Iconic icons with Bootstrap Icons
* [Changed] Made Icons8 images offline available
* [Fixed] App Startup will now wait for availability of MySql database [#50](https://github.com/TheAxelander/OpenBudgeteer/issues/50)
* [Fixed] Rules disappear after Cancel All [#102](https://github.com/TheAxelander/OpenBudgeteer/issues/102)
* [Fixed] Correct number of months shown on Report Page (e.g. should show past 24 months but displays 25 months)

### 1.5.2 (2022-03-26)

Expand Down
34 changes: 17 additions & 17 deletions OpenBudgeteer.Blazor/Pages/Bucket.razor
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
@page "/bucket"
@using OpenBudgeteer.Blazor.ViewModels
@using OpenBudgeteer.Core.Common.Database
@using OpenBudgeteer.Core.ViewModels
@using OpenBudgeteer.Core.ViewModels.ItemViewModels
Expand Down Expand Up @@ -283,7 +284,7 @@
<td class="col-buttons">
@if (bucket.IsHovered)
{
<button class="btn btn-sm btn-primary bi bi-list-ul" @onclick="@(() => DisplayBucketTransactions(bucket))"></button>
<button class="btn btn-sm btn-primary bi bi-list-ul" @onclick="@(() => DisplayBucketDetails(bucket))"></button>
<button class="btn btn-sm btn-primary bi bi-pencil" @onclick="@(() => ShowEditBucketDialog(bucket))"></button>
<button class="btn btn-sm btn-danger bi bi-trash3" @onclick="@(() => CloseBucket(bucket))"></button>
}
Expand All @@ -308,13 +309,13 @@
OnCancelClickCallback="@(CancelEditBucketDialog)"
OnSaveClickCallback="@(SaveAndCloseEditBucketDialog)"/>

<TransactionDialog
Title="Bucket Transactions"
DataContext="@_transactionModalDialogDataContext"
IsDialogVisible="@_isTransactionModalDialogVisible"
IsDialogLoading="@_isTransactionModalDialogDataContextLoading"
<BucketDetailsDialog
Title="Bucket Details"
DataContext="@_bucketDetailsModalDialogDataContext"
IsDialogVisible="@_isBucketDetailsModalDialogVisible"
IsDialogLoading="@_isBucketDetailsModalDialogDataContextLoading"
CurrentBucket ="@_transactionModalDialogBucket"
OnClickCallback="@(() => _isTransactionModalDialogVisible = false)"/>
OnClickCallback="@(() => _isBucketDetailsModalDialogVisible = false)"/>

<ErrorMessageDialog
Title="Bucket"
Expand All @@ -331,10 +332,10 @@
BucketViewModelItem _editBucketDialogDataContext;
bool _isEditBucketModalDialogVisible;

TransactionViewModel _transactionModalDialogDataContext;
BlazorBucketStatisticsViewModel _bucketDetailsModalDialogDataContext;
OpenBudgeteer.Core.Models.Bucket _transactionModalDialogBucket;
bool _isTransactionModalDialogVisible;
bool _isTransactionModalDialogDataContextLoading;
bool _isBucketDetailsModalDialogVisible;
bool _isBucketDetailsModalDialogDataContextLoading;

bool _isErrorModalDialogVisible;
string _errorModalDialogMessage;
Expand Down Expand Up @@ -451,16 +452,15 @@
}
}

async void DisplayBucketTransactions(BucketViewModelItem bucket)
async void DisplayBucketDetails(BucketViewModelItem bucket)
{
_isTransactionModalDialogVisible = true;
_isTransactionModalDialogDataContextLoading = true;
_isBucketDetailsModalDialogVisible = true;
_isBucketDetailsModalDialogDataContextLoading = true;

_transactionModalDialogDataContext = new TransactionViewModel(DbContextOptions, YearMonthDataContext);
_transactionModalDialogBucket = bucket.Bucket;
await HandleResult(await _transactionModalDialogDataContext.LoadDataAsync(bucket.Bucket, true));
_bucketDetailsModalDialogDataContext = new BlazorBucketStatisticsViewModel(DbContextOptions, YearMonthDataContext, bucket.Bucket);
await _bucketDetailsModalDialogDataContext.LoadDataAsync(true);

_isTransactionModalDialogDataContextLoading = false;
_isBucketDetailsModalDialogDataContextLoading = false;
StateHasChanged();
}
}
114 changes: 114 additions & 0 deletions OpenBudgeteer.Blazor/Shared/BucketDetailsDialog.razor
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
@using ChartJs.Blazor
@using ChartJs.Blazor.ChartJS.BarChart
@using ChartJs.Blazor.Charts
@using OpenBudgeteer.Blazor.ViewModels
@using OpenBudgeteer.Core.Models

@if (IsDialogVisible)
{
<div class="modal fade show" style=" display: block;">
<div class="modal-dialog modal-dialog-scrollable" style="max-width: 1000px">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">@Title</h4>
<button type="button" class="btn-close" data-dismiss="modal" @onclick="OnClickCallback"></button>
</div>
<div class="modal-body">
@if (IsDialogLoading)
{
<div>Loading...</div>
}
else
{
<ul class="nav nav-tabs" id="bucket-details-tabs" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="movements-tab" data-bs-toggle="tab" data-bs-target="#bucket-movements" type="button" role="tab" aria-controls="bucket-movements" aria-selected="true">Movements</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="statistics-tab" data-bs-toggle="tab" data-bs-target="#bucket-statistics" type="button" role="tab" aria-controls="bucket-statistics" aria-selected="false">Statistics</button>
</li>
</ul>
<div class="tab-content" id="bucket-details-tabs-content">
<div class="tab-pane fade show active" id="bucket-movements" role="tabpanel" aria-labelledby="movements-tab">
<input checked="checked" type="checkbox" @onchange="HideBucketMovementCheckboxClicked"/>
<label>Show Bucket Movements</label>
<table class="table table-sm table-hover">
<thead>
<tr class="header-row">
<th style="text-align: right; width:110px">Date</th>
<th style="width:150px">Account</th>
<th style="width:250px">Payee</th>
<th>Memo</th>
<th style="text-align: right; width: 90px">Amount</th>
</tr>
</thead>
<tbody>
@foreach (var transaction in DataContext.BucketMovementsData.Transactions)
{
<tr>
<td style="text-align: right">@transaction.Transaction.TransactionDate.ToShortDateString()</td>
<td>@transaction.SelectedAccount.Name</td>
<td>@transaction.Transaction.Payee</td>
<td>@transaction.Transaction.Memo</td>
<td style="text-align: right">@transaction.Transaction.Amount</td>
</tr>
}
</tbody>
</table>
</div>
<div class="tab-pane fade" id="bucket-statistics" role="tabpanel" aria-labelledby="statistics-tab">
<div class="row">
<div class="col report-chart-box">
<h4 class="report-chart-header">Month Balances</h4>
<ChartJsBarChart Config="@DataContext.MonthBalancesConfig"/>
</div>
<div class="col report-chart-box">
<h4 class="report-chart-header">Input & Output</h4>
<ChartJsBarChart Config="@DataContext.MonthInputOutputConfig"/>
</div>
</div>
<div class="row">
<div class="col report-chart-box">
<h4 class="report-chart-header">Balance Progression</h4>
<ChartJsLineChart Config="@DataContext.BucketProgressionConfig"/>
</div>
</div>
</div>
</div>
}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal" @onclick="OnClickCallback">Close</button>
</div>
</div>
</div>
</div>
<div class="modal-backdrop fade show"></div>
}

@code {
[Parameter]
public string Title { get; set; }

[Parameter]
public BlazorBucketStatisticsViewModel DataContext { get; set; }

[Parameter]
public bool IsDialogVisible { get; set; }

[Parameter]
public bool IsDialogLoading { get; set; }

[Parameter]
public Bucket CurrentBucket { get; set; }

[Parameter]
public EventCallback<MouseEventArgs> OnClickCallback { get; set; }

private async void HideBucketMovementCheckboxClicked(ChangeEventArgs eventArgs)
{
await DataContext.LoadBucketMovementsDataAsync((bool)eventArgs.Value);
StateHasChanged();
}

}
12 changes: 0 additions & 12 deletions OpenBudgeteer.Blazor/Shared/TransactionDialog.razor
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,6 @@
}
else
{
@if (CurrentBucket != null)
{
<input checked="checked" type="checkbox" @onchange="HideBucketMovementCheckboxClicked"/>
<label>Show Bucket Movements</label>
}
<table class="table table-sm table-hover">
<thead>
<tr class="header-row">
Expand Down Expand Up @@ -74,11 +69,4 @@

[Parameter]
public EventCallback<MouseEventArgs> OnClickCallback { get; set; }

private async void HideBucketMovementCheckboxClicked(ChangeEventArgs eventArgs)
{
await DataContext.LoadDataAsync(CurrentBucket, (bool)eventArgs.Value);
StateHasChanged();
}

}
Loading

0 comments on commit d235e3a

Please sign in to comment.