- Edited the data viz js

- Updated the styles
- Updated the dashboard landing page
- Added a test file
This commit is contained in:
Jonathan Bobel
2023-12-18 11:21:51 -05:00
parent fa8a6aa0ba
commit eb09f846d9
4 changed files with 151 additions and 57 deletions

View File

@@ -1,24 +1,71 @@
(function (window) { (function (window) {
// Dummy data (replace with API data) // Dummy data (replace with API data)
const totalMessages = 1000; const data = {
const delivered = 800; messageStats: {
const pending = 100; totalMessages: 1000,
const failed = 100; delivered: 800,
pending: 100,
failed: 100
},
dailyUsage: {
dailyUsage: 20,
dailyUsageLimit: 100
},
yearlyUsage: {
yearlyUsage: 2000,
yearlyUsageLimit: 250000
}
};
// Calculate percentages // Update total messages progress bar percentages
const deliveredPercentage = (delivered / totalMessages) * 100; const messageStats = data.messageStats;
const pendingPercentage = (pending / totalMessages) * 100;
const failedPercentage = (failed / totalMessages) * 100;
// Set width of bars const messageBars = ["delivered", "pending", "failed"];
document.getElementById("delivered").style.width = `${deliveredPercentage}%`; for (const bar of messageBars) {
document.getElementById("pending").style.width = `${pendingPercentage}%`; const percentage = messageStats[bar] / messageStats.totalMessages * 100;
document.getElementById("failed").style.width = `${failedPercentage}%`; const elementId = `${bar}-bar`;
const element = document.getElementById(elementId);
element.style.width = `${parseFloat(percentage)}%`;
}
// Update legend values // Update total messages progress bar percentages
document.getElementById("delivered-value").innerText = delivered; const dailyUsage = data.dailyUsage;
document.getElementById("pending-value").innerText = pending; const dailyUsageLimit = dailyUsage.dailyUsageLimit;
document.getElementById("failed-value").innerText = failed; const yearlyUsage = data.yearlyUsage;
const yearlyUsageLimit = yearlyUsage.yearlyUsageLimit;
function updateUsageBar(elementId, dailyUsage, dailyUsageLimit, yearlyUsage, yearlyUsageLimit) {
// Ensure element exists
if (!elementId || !document.getElementById(elementId)) {
console.error(`Element with ID "${elementId}" not found`);
return;
}
// Calculate percentage
const percentage = dailyUsage / dailyUsageLimit * 100;
// Update bar width
const element = document.getElementById(elementId);
element.style.width = `${parseFloat(percentage)}%`;
}
// Update usage bars
updateUsageBar("dailyUsage-bar", dailyUsage.dailyUsage, dailyUsageLimit);
updateUsageBar("dailyUsageRemaining-bar", dailyUsageLimit - dailyUsage.dailyUsage, dailyUsageLimit);
updateUsageBar("yearlyUsage-bar", yearlyUsage.yearlyUsage, yearlyUsageLimit);
updateUsageBar("yearlyUsageRemaining-bar", yearlyUsageLimit - yearlyUsage.yearlyUsage, yearlyUsageLimit);
// Update total messages legend values
document.getElementById("total-value").innerText = `Total: ${messageStats.totalMessages} messages`;
document.getElementById("delivered-value").innerText = `Delivered: ${messageStats.delivered}`;
document.getElementById("pending-value").innerText = `Pending: ${messageStats.pending}`;
document.getElementById("failed-value").innerText = `Failed: ${messageStats.failed}`;
// Update usage legend values
document.getElementById("daily-usage-value").innerText = dailyUsage.dailyUsage;
document.getElementById("daily-remaining-value").innerText = dailyUsage.dailyUsageLimit - dailyUsage.dailyUsage;
document.getElementById("yearly-usage-value").innerText = yearlyUsage.yearlyUsage;
document.getElementById("yearly-remaining-value").innerText = yearlyUsage.yearlyUsageLimit - yearlyUsage.yearlyUsage;
})(window); })(window);

View File

@@ -1,42 +1,67 @@
@use "uswds-core" as *; @use "uswds-core" as *;
$delivered: color('blue-50v');
$pending: color('green-cool-40v');
$failed: color('orange-30v');
.chart-container { .chart-container {
display: flex; display: flex;
height: 100px; height: units(10);
&.usage {
height: units(5);
}
} }
.bar { .bar {
height: 30px; &.delivered, &.usage {
transition: width 0.5s ease; background-color: $delivered;
&#delivered { margin-right: 1px;
background-color: green;
} }
&#pending { &.pending{
background-color: yellow; background-color: $pending;
margin-right: 1px;
} }
&#failed { &.failed, &.remaining {
background-color: red; background-color: $failed;
} }
} }
.legend { .legend {
display: flex; display: flex;
justify-content: center; margin: units(1) 0;
margin-top: 10px;
.legend-item { .legend-item {
display: flex; display: flex;
align-items: center; align-items: center;
margin: 0 15px; margin-right: units(2);
} }
.legend-color { .legend-color {
width: 20px; width: units(3);
height: 20px; height: units(3);
margin-right: 5px; margin-right: units(1);
background-color: $delivered;
&.pending {
background-color: $pending;
}
&.failed, &.remaining {
background-color: $failed;
}
} }
.legend-label { .legend-label {
margin-right: 5px; margin-right: 5px;
} }
} }
.progress-bar {
width: 300px;
height: 20px;
background-color: #eee;
border-radius: 5px;
margin-bottom: 10px;
}
.progress-bar-inner {
height: 100%;
background-color: #007bff;
border-radius: inherit;
}

View File

@@ -14,10 +14,6 @@
<div class="dashboard margin-bottom-8"> <div class="dashboard margin-bottom-8">
<div>
<canvas id="myChart"></canvas>
</div>
<h1 class="usa-sr-only">Dashboard</h1> <h1 class="usa-sr-only">Dashboard</h1>
{% if current_user.has_permissions('manage_templates') and not current_service.all_templates %} {% if current_user.has_permissions('manage_templates') and not current_service.all_templates %}
{% include 'views/dashboard/write-first-messages.html' %} {% include 'views/dashboard/write-first-messages.html' %}
@@ -26,36 +22,66 @@
<h2 class="font-body-xl margin-0"> <h2 class="font-body-xl margin-0">
SMS Activity SMS Activity
</h2> </h2>
<h3>Total 1000</h3> <h3 id="total-value" class="margin-y-1"></h3>
<div class="chart-container"> <div class="chart-container">
<div class="bar" id="delivered"></div> <div class="bar delivered" id="delivered-bar"></div>
<div class="bar" id="pending"></div> <div class="bar pending" id="pending-bar"></div>
<div class="bar" id="failed"></div> <div class="bar failed" id="failed-bar"></div>
</div> </div>
<div class="legend"> <div class="legend">
<div class="legend-item"> <div class="legend-item">
<div class="legend-color" style="background-color: green;"></div> <div class="legend-color delivered"></div>
<div class="legend-label">Delivered</div>
<div class="legend-value" id="delivered-value"></div> <div class="legend-value" id="delivered-value"></div>
</div> </div>
<div class="legend-item"> <div class="legend-item">
<div class="legend-color" style="background-color: yellow;"></div> <div class="legend-color pending"></div>
<div class="legend-label">Pending</div>
<div class="legend-value" id="pending-value"></div> <div class="legend-value" id="pending-value"></div>
</div> </div>
<div class="legend-item"> <div class="legend-item">
<div class="legend-color" style="background-color: red;"></div> <div class="legend-color failed"></div>
<div class="legend-label">Failed</div>
<div class="legend-value" id="failed-value"></div> <div class="legend-value" id="failed-value"></div>
</div> </div>
</div> </div>
{{ pill(years, selected_year, big_number_args={'smallest': True}) }} <h2 class="font-body-xl margin-top-4 margin-bottom-1">Usage</h2>
<h3 class="margin-y-0">Daily</h3>
<p class="margin-top-0 margin-bottom-1">Across all services</p>
Test: <h3 id="total-daily-usage" class="margin-0"></h3>
You have sent <div class="chart-container usage">
{{ big_number(sms_sent, 'messages of your', smaller=True) }} <div class="bar usage" id="dailyUsage-bar"></div>
{{ big_number(sms_free_allowance, 'free messages allowance.', smaller=True) }} <div class="bar remaining" id="dailyUsageRemaining-bar"></div>
</div>
<div class="legend">
<div class="legend-item">
<div class="legend-color daily-usage"></div>
<div class="legend-label">Daily usage</div>
<div class="legend-value" id="daily-usage-value"></div>
</div>
<div class="legend-item">
<div class="legend-color remaining"></div>
<div class="legend-label">Remaining messages today</div>
<div class="legend-value" id="daily-remaining-value"></div>
</div>
</div>
<h3 id="total-yearly-usage" class="margin-bottom-0">This year</h3>
<div class="chart-container usage">
<div class="bar usage" id="yearlyUsage-bar"></div>
<div class="bar remaining" id="yearlyUsageRemaining-bar"></div>
</div>
<div class="legend">
<div class="legend-item">
<div class="legend-color usage"></div>
<div class="legend-label">Yearly usage</div>
<div class="legend-value" id="yearly-usage-value"></div>
</div>
<div class="legend-item">
<div class="legend-color remaining"></div>
<div class="legend-label">Remaining yearly messages</div>
<div class="legend-value" id="yearly-remaining-value"></div>
</div>
</div>
<h2 class="font-body-xl margin-0"> <h2 class="font-body-xl margin-0">
Messages sent Messages sent
@@ -68,9 +94,6 @@
{{ ajax_block(partials, updates_url, 'template-statistics') }} {{ ajax_block(partials, updates_url, 'template-statistics') }}
<h2 class="margin-top-4 margin-bottom-1">Usage</h2>
<h3 class="margin-bottom-0">Daily</h3>
<p class="margin-0">Across all services</p>
<table class="usa-table usa-table--borderless margin-top-1 margin-bottom-5"> <table class="usa-table usa-table--borderless margin-top-1 margin-bottom-5">
<caption class="usa-sr-only"> <caption class="usa-sr-only">
Daily Daily
@@ -85,7 +108,6 @@
<tr> <tr>
<td>{{ global_message_limit - daily_global_messages_remaining }}</td> <td>{{ global_message_limit - daily_global_messages_remaining }}</td>
<td>{{ daily_global_messages_remaining }}</td> <td>{{ daily_global_messages_remaining }}</td>
<td>{{ current_service.message_limit }}</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>