Added account history in the ui.

This commit is contained in:
didier amyot committed 2023-04-10 17:21:44 -04:00
1 parent f4593df95b
commit 18e7b0df1c
5 files changed
+78 -10

No files matched your search

+55 -2
View File
@@ -1,4 +1,5 @@
{% set active_navbar_item = 'accounts' %}
{% set script_chart_js = true %}
{% extends "base.html" %}
@@ -7,7 +8,8 @@
<table class="uk-table uk-table-divider uk-table-striped uk-table-hover uk-table-small">
<caption>Summary</caption>
<tr><th>ID</th><td>{{ account.id | micro_id }}</td></tr>
<tr><th>Micro ID</th><td>{{ account.id | micro_id }}</td></tr>
<tr><th>Account ID</th><td>{{ account.id }}</td></tr>
<tr><th>Label</th><td>{{ account.label }}</td></tr>
<tr><th>Amount</th><td>{{ account.amount | thousand_separator }}</td></tr>
<tr><th>Account Type</th><td>{{ account.account_type | replace("_", " ") | lower}}</td></tr>
@@ -15,7 +17,58 @@
<tr><th>Security</th><td>{{ account.security.symbol }}</td></tr>
</table>
<canvas id="account-history-chart"></canvas>
<pre> {{ "hello" | tojson }}</pre>
<script>
const ctx = document.getElementById('account-history-chart');
const labels = {{account_history.timestamps | tojson }};
const datapoints = {{ account_history.amounts | tojson }};
const data = {
labels: labels.map(x => new Date(1000 * x)),
datasets: [
{
label: {{ account.id | micro_id | tojson }},
data: datapoints,
fill: false,
tension: 0.4
}
]
};
const config = {
type: 'line',
data: data,
options: {
responsive: true,
plugins: {
title: {
display: true,
text: 'Account Amount History'
},
},
interaction: {
intersect: false,
},
scales: {
x: {
display: true,
type: 'time',
title: {
display: true
}
},
y: {
display: true,
title: {
display: true,
text: 'Value'
},
suggestedMin: 0,
}
}
},
};
new Chart(ctx, config);
</script>
{% endblock %}
+9 -1
View File
@@ -1,3 +1,5 @@
{% set values = {} %}
<!doctype html>
<html>
<head>
@@ -15,11 +17,17 @@
<script src="/static/vendor/uikit-icons.min.js"></script>
<script src="/static/vendor/htmx.org@1.8.5"></script>
<script src="/static/embedded-json-enc.js"></script>
{% if script_chart_js %}
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/luxon@3.3.0/build/global/luxon.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-adapter-luxon"></script>
{% endif %}
</head>
<body>
<div hx-headers='{"myHeader": "My Value"}'>
<div>
{% include "components/navbar.html" %}
<div class="uk-grid">
+1 -1
View File
@@ -24,7 +24,7 @@ impl AccountHistory {
pub fn get_account_history(tx: &Connection, account_id: &AccountId) -> CustomResult<AccountHistory> {
let q = "
SELECT amount, CAST(timestamp AS INT) AS timestamp
SELECT amount, UNIXEPOCH(timestamp) AS timestamp
FROM accounts_history
WHERE account_id = ?1
ORDER BY account_version ASC
+11 -5
View File
@@ -22,9 +22,10 @@ pub struct AccountDTO {
pub label: String,
}
#[derive(Deserialize, Serialize, Debug)]
#[derive(Serialize, Debug)]
pub struct AccountHistoryDTO {
amounts: Vec<i64>,
timestamps: Vec<i64>,
}
impl AccountDTO {
@@ -72,9 +73,14 @@ impl AccountService<'_> {
Ok(AccountDTO::from_entity(ret))
}
pub fn get_account_history_by_id(&self, account_id: &AccountId, user_id: &UserId) -> CustomResult<()> {
let ret = account_history::get_account_history(self.conn, account_id)?;
pub fn get_account_history_by_id(&self, account_id: &AccountId, user_id: &UserId) -> CustomResult<AccountHistoryDTO> {
let ac = account_history::get_account_history(self.conn, account_id)?;
// ret.account()
let ret = AccountHistoryDTO{
amounts: ac.amount().clone(),
timestamps: ac.timestamps().clone(),
};
Ok(())
Ok(ret)
}
}
+2 -1
View File
@@ -45,7 +45,8 @@ pub async fn get_account(tmpl_env: MiniJinjaRenderer,
let user_id = auth_service.get_login(&req).unwrap();
let ctx = context!{
account => account_service.get_account_by_id(&account_id, &user_id).map_err(error::ErrorInternalServerError)?
account => account_service.get_account_by_id(&account_id, &user_id).map_err(error::ErrorInternalServerError)?,
account_history => account_service.get_account_history_by_id(&account_id, &user_id).map_err(error::ErrorInternalServerError)?
};
tmpl_env.render("account.html", ctx)
}