Revert "Revert "Restyle template statistics and received text messages""

This commit is contained in:
Chris Hill-Scott
2020-02-18 16:16:51 +00:00
committed by GitHub
parent a8ca8c1835
commit 3bbd5381c6
15 changed files with 186 additions and 114 deletions
@@ -137,3 +137,58 @@
} }
} }
.banner-dashboard {
$baseline-shift: 5px;
display: block; // for browsers that don't support flexbox
display: flex;
align-items: baseline;
flex-wrap: wrap;
padding: ($gutter-half - 1px) 0 ($gutter-half + 1px) 0;
border-top: 1px solid $border-colour;
border-bottom: 1px solid $border-colour;
margin-bottom: $gutter;
text-decoration: none;
&:focus {
border-top: 1px solid transparent;
border-bottom: 1px solid transparent;
}
&-count,
&-meta {
float: left; // for browsers that don't support flexbox
}
&-count {
@include govuk-font(36, $weight: bold);
padding-right: 8px;
position: relative;
// remove the top of the extra line-height this introduces
top: $baseline-shift;
margin-top: -$baseline-shift;
flex: 0 1 0.85ch;
}
&-count-label {
@include govuk-font(24, $weight: bold);
text-decoration: underline;
padding-right: govuk-spacing(6);
margin: 10px 0px 5px; // 10px includes 5px extra to counter the -5px margin-top on the count item
flex: 2 1 auto;
}
&-meta {
@include govuk-font(19);
float: right;
text-align: right;
flex: initial;
}
& + .banner-dashboard {
margin-top: -$gutter;
border-top: none;
}
}
@@ -4,7 +4,7 @@
@include core-16; @include core-16;
display: block; display: block;
padding: 0 0; padding: 0 0;
margin: $gutter-half 0 $gutter 0; margin: $gutter-half 0 $gutter-half 0;
text-align: center; text-align: center;
border-top: 1px solid $border-colour; border-top: 1px solid $border-colour;
@@ -34,7 +34,8 @@
} }
.show-more-empty { .show-more-no-border {
@extend %show-more; @extend %show-more;
margin-top: -10px; border-top: 1px solid transparent;
margin-top: -5px;
} }
@@ -51,6 +51,66 @@
} }
.template-statistics-table {
.table {
table-layout: fixed;
}
.table-heading {
@include core-19;
margin: 0 0 10px 0;
}
.table-field-heading-first {
width: 52.5%;
}
.table-row {
th {
display: table-cell;
width: 52.5%;
font-weight: normal;
.hint,
p {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
&-template-name {
@include bold-24;
display: block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding: 10px 0 32px 0;
margin: -10px 0 -32px 0;
&:focus {
color: $text-colour;
& + .template-statistics-table-hint {
color: $text-colour;
}
}
}
&-hint {
@include core-19;
color: $secondary-text-colour;
pointer-events: none;
}
}
.settings-table { .settings-table {
table { table {
+8 -27
View File
@@ -1,15 +1,7 @@
.dashboard { .dashboard {
table { th {
th { font-weight: normal;
@include core-19;
border-bottom: 0;
}
td {
@include core-19;
border: 0;
}
} }
> .heading-medium:first-of-type { > .heading-medium:first-of-type {
@@ -34,15 +26,17 @@
color: $text-colour; color: $text-colour;
text-align: left; text-align: left;
span { &-bar {
@include bold-27;
box-sizing: border-box; box-sizing: border-box;
display: inline-block; display: inline-block;
overflow: visible; overflow: visible;
background: $panel-colour; background: $panel-colour;
color: $black; color: $black;
padding: 5px 5px 2px 5px; padding: 10px 6px 8px 0;
text-indent: -2px; text-indent: 12px;
margin: 3px 0 5px 0; text-align: right;
margin: 2px 0 1px 0;
transition: width 0.6s ease-in-out; transition: width 0.6s ease-in-out;
} }
@@ -84,19 +78,6 @@
color: $error-colour; color: $error-colour;
} }
.template-usage-table {
border-top: 1px solid $border-colour;
border-bottom: 1px solid $border-colour;
margin-top: 10px;
margin-bottom: $gutter * 1.3333;
.table {
margin-bottom: 5px;
}
}
.align-with-message-body { .align-with-message-body {
display: block; display: block;
margin-top: $gutter * 5 / 6; margin-top: $gutter * 5 / 6;
-19
View File
@@ -280,15 +280,8 @@ def get_dashboard_partials(service_id):
all_statistics = template_statistics_client.get_template_statistics_for_service(service_id, limit_days=7) all_statistics = template_statistics_client.get_template_statistics_for_service(service_id, limit_days=7)
template_statistics = aggregate_template_usage(all_statistics) template_statistics = aggregate_template_usage(all_statistics)
stats = aggregate_notifications_stats(all_statistics) stats = aggregate_notifications_stats(all_statistics)
column_width, max_notifiction_count = get_column_properties(3)
dashboard_totals = get_dashboard_totals(stats), dashboard_totals = get_dashboard_totals(stats),
highest_notification_count = max(
sum(
value[key] for key in {'requested', 'failed', 'delivered'}
)
for key, value in dashboard_totals[0].items()
)
free_sms_allowance = billing_api_client.get_free_sms_fragment_limit_for_year( free_sms_allowance = billing_api_client.get_free_sms_fragment_limit_for_year(
current_service.id, current_service.id,
get_current_financial_year(), get_current_financial_year(),
@@ -312,10 +305,6 @@ def get_dashboard_partials(service_id):
'views/dashboard/_totals.html', 'views/dashboard/_totals.html',
service_id=service_id, service_id=service_id,
statistics=dashboard_totals[0], statistics=dashboard_totals[0],
column_width=column_width,
smaller_font_size=(
highest_notification_count > max_notifiction_count
),
), ),
'template-statistics': render_template( 'template-statistics': render_template(
'views/dashboard/template-statistics.html', 'views/dashboard/template-statistics.html',
@@ -330,7 +319,6 @@ def get_dashboard_partials(service_id):
), ),
'usage': render_template( 'usage': render_template(
'views/dashboard/_usage.html', 'views/dashboard/_usage.html',
column_width=column_width,
**calculate_usage(yearly_usage, free_sms_allowance), **calculate_usage(yearly_usage, free_sms_allowance),
), ),
} }
@@ -505,10 +493,3 @@ def get_tuples_of_financial_years(
) )
for year in range(start, end + 1) for year in range(start, end + 1)
) )
def get_column_properties(number_of_columns):
return {
2: ('column-half', 999999999),
3: ('column-third', 99999),
}.get(number_of_columns)
+5 -6
View File
@@ -1,7 +1,6 @@
{% macro show_more(url=None, label=None) %} {% macro show_more(url, label, with_border=True) %}
{% if url and label %} <a
<a href="{{ url }}" class="show-more"><span>{{ label }}</span></a> href="{{ url }}"
{% else %} class="show-more{% if not with_border %}-no-border{% endif %}"
<span class="show-more-empty"></span> ><span>{{ label }}</span></a>
{% endif %}
{% endmacro %} {% endmacro %}
+2 -5
View File
@@ -188,11 +188,8 @@
) %} ) %}
{% call field(align='right') %} {% call field(align='right') %}
<span {% if id %}id="{{ id }}"{% endif %} class="spark-bar"> <span {% if id %}id="{{ id }}"{% endif %} class="spark-bar">
<span style="width: {{ count / max_count * 100 }}%"> <span class="spark-bar-bar" style="width: {{ count / max_count * 100 }}%">
{{ big_number( {{ '{:,.0f}'.format(count) }}
count,
smallest=True
) }}
</span> </span>
</span> </span>
{% endcall %} {% endcall %}
+13 -14
View File
@@ -1,21 +1,20 @@
{% from "components/big-number.html" import big_number, big_number_with_status %} {% from "components/big-number.html" import big_number, big_number_with_status %}
{% from "components/message-count-label.html" import message_count_label %}
<div class="ajax-block"> <div class="ajax-block">
{% if inbound_sms_summary != None %} {% if inbound_sms_summary != None %}
<div id="total-received" class="big-number-meta-wrapper"> <a id="total-received" class="govuk-link govuk-link--no-visited-state banner-dashboard" href="{{ url_for('.inbox', service_id=current_service.id) }}">
{{ <span class="banner-dashboard-count">
big_number_with_status( {{ inbound_sms_summary.count|format_thousands }}
inbound_sms_summary.count, </span>
'text messages received', <span class="banner-dashboard-count-label">
link=url_for('.inbox', service_id=current_service.id), {{ message_count_label(inbound_sms_summary.count, 'sms', suffix='received') }}
show_failures=False </span>
) {% if inbound_sms_summary.most_recent %}
}} <span class="banner-dashboard-meta">
<div class="big-number-meta">
{% if inbound_sms_summary.most_recent %}
latest message {{ inbound_sms_summary.most_recent | format_delta }} latest message {{ inbound_sms_summary.most_recent | format_delta }}
{% endif %} </span>
</div> {% endif %}
</div> </a>
{% endif %} {% endif %}
</div> </div>
+6 -6
View File
@@ -3,7 +3,7 @@
<div class="ajax-block-container"> <div class="ajax-block-container">
<div class="grid-row"> <div class="grid-row">
<div id="total-email" class="{{column_width}}"> <div id="total-email" class="column-third">
{{ big_number_with_status( {{ big_number_with_status(
statistics['email']['requested'], statistics['email']['requested'],
message_count_label(statistics['email']['requested'], 'email', suffix='sent'), message_count_label(statistics['email']['requested'], 'email', suffix='sent'),
@@ -12,10 +12,10 @@
statistics['email']['show_warning'], statistics['email']['show_warning'],
failure_link=url_for(".view_notifications", service_id=service_id, message_type='email', status='failed'), failure_link=url_for(".view_notifications", service_id=service_id, message_type='email', status='failed'),
link=url_for(".view_notifications", service_id=service_id, message_type='email', status='sending,delivered,failed'), link=url_for(".view_notifications", service_id=service_id, message_type='email', status='sending,delivered,failed'),
smaller=smaller_font_size smaller=True,
) }} ) }}
</div> </div>
<div id="total-sms" class="{{column_width}}"> <div id="total-sms" class="column-third">
{{ big_number_with_status( {{ big_number_with_status(
statistics['sms']['requested'], statistics['sms']['requested'],
message_count_label(statistics['sms']['requested'], 'sms', suffix='sent'), message_count_label(statistics['sms']['requested'], 'sms', suffix='sent'),
@@ -24,10 +24,10 @@
statistics['sms']['show_warning'], statistics['sms']['show_warning'],
failure_link=url_for(".view_notifications", service_id=service_id, message_type='sms', status='failed'), failure_link=url_for(".view_notifications", service_id=service_id, message_type='sms', status='failed'),
link=url_for(".view_notifications", service_id=service_id, message_type='sms', status='sending,delivered,failed'), link=url_for(".view_notifications", service_id=service_id, message_type='sms', status='sending,delivered,failed'),
smaller=smaller_font_size smaller=True,
) }} ) }}
</div> </div>
<div id="total-letters" class="{{column_width}}"> <div id="total-letters" class="column-third">
{{ big_number_with_status( {{ big_number_with_status(
statistics['letter']['requested'], statistics['letter']['requested'],
message_count_label(statistics['letter']['requested'], 'letter', suffix='sent'), message_count_label(statistics['letter']['requested'], 'letter', suffix='sent'),
@@ -36,7 +36,7 @@
statistics['letter']['show_warning'], statistics['letter']['show_warning'],
failure_link=url_for(".view_notifications", service_id=service_id, message_type='letter', status='failed'), failure_link=url_for(".view_notifications", service_id=service_id, message_type='letter', status='failed'),
link=url_for(".view_notifications", service_id=service_id, message_type='letter', status=''), link=url_for(".view_notifications", service_id=service_id, message_type='letter', status=''),
smaller=smaller_font_size smaller=True,
) }} ) }}
</div> </div>
</div> </div>
@@ -36,7 +36,6 @@
) }} ) }}
{% endcall %} {% endcall %}
{% endcall %} {% endcall %}
{{ show_more() }}
</div> </div>
{% endif %} {% endif %}
</div> </div>
+3 -3
View File
@@ -1,12 +1,12 @@
{% from "components/big-number.html" import big_number %} {% from "components/big-number.html" import big_number %}
<div class='grid-row ajax-block-container'> <div class='grid-row ajax-block-container'>
<div class='{{ column_width }}'> <div class='column-third'>
<div class="keyline-block"> <div class="keyline-block">
{{ big_number("Unlimited", 'free email allowance', smaller=True) }} {{ big_number("Unlimited", 'free email allowance', smaller=True) }}
</div> </div>
</div> </div>
<div class='{{ column_width }}'> <div class='column-third'>
<div class="keyline-block"> <div class="keyline-block">
{% if sms_chargeable %} {% if sms_chargeable %}
{{ big_number( {{ big_number(
@@ -20,7 +20,7 @@
{% endif %} {% endif %}
</div> </div>
</div> </div>
<div class='{{ column_width }}'> <div class='column-third'>
<div class="keyline-block"> <div class="keyline-block">
{{ big_number( {{ big_number(
letter_cost, letter_cost,
@@ -28,7 +28,7 @@
No messages sent No messages sent
</p> </p>
{% else %} {% else %}
<div class='dashboard-table template-usage-table'> <div class='template-statistics-table'>
{% call(item, row_number) list_table( {% call(item, row_number) list_table(
month.templates_used, month.templates_used,
caption=month.name, caption=month.name,
@@ -41,8 +41,8 @@
field_headings_visible=False field_headings_visible=False
) %} ) %}
{% call row_heading() %} {% call row_heading() %}
<a class="file-list-filename" href="{{ url_for('.view_template', service_id=current_service.id, template_id=item.id) }}">{{ item.name }}</a> <a class="template-statistics-table-template-name" href="{{ url_for('.view_template', service_id=current_service.id, template_id=item.id) }}">{{ item.name }}</a>
<span class="file-list-hint"> <span class="template-statistics-table-hint">
{{ message_count_label(1, item.type, suffix='template')|capitalize }} {{ message_count_label(1, item.type, suffix='template')|capitalize }}
</span> </span>
{% endcall %} {% endcall %}
@@ -6,39 +6,41 @@
<div class="ajax-block-container"> <div class="ajax-block-container">
{% if template_statistics|length > 1 %} {% if template_statistics|length > 1 %}
<div class='dashboard-table'> <div class='template-statistics-table'>
{% call(item, row_number) list_table( {% call(item, row_number) list_table(
template_statistics, template_statistics,
caption="Templates used", caption="By template",
caption_visible=False, caption_visible=True,
empty_message='', empty_message='',
field_headings=[ field_headings=[
'Template', 'Template',
'Messages sent' 'Messages sent'
], ],
field_headings_visible=True field_headings_visible=False
) %} ) %}
{% call row_heading() %} {% call row_heading() %}
{% if item.is_precompiled_letter %} {% if item.is_precompiled_letter %}
<span class="file-list-filename"> <span class="template-statistics-table-template-name">
Provided as PDF Provided as PDF
</span> </span>
<span class="file-list-hint"> <span class="template-statistics-table-hint">
Letter Letter
</span> </span>
{% else %} {% else %}
<a class="file-list-filename" href="{{ url_for('.view_template', service_id=current_service.id, template_id=item.template_id) }}">{{ item.template_name }}</a> <a class="template-statistics-table-template-name" href="{{ url_for('.view_template', service_id=current_service.id, template_id=item.template_id) }}">{{ item.template_name }}</a>
<span class="file-list-hint"> <span class="template-statistics-table-hint">
{{ message_count_label(1, item.template_type, suffix='template')|capitalize }} {{ message_count_label(1, item.template_type, suffix='template')|capitalize }}
</span> </span>
{% endif %} {% endif %}
{% endcall %} {% endcall %}
{{ spark_bar_field(item.count, most_used_template_count, id=item.template_id) }} {{ spark_bar_field(item.count, most_used_template_count, id=item.template_id) }}
{% endcall %} {% endcall %}
{{ show_more( {{ show_more(
url_for('.template_usage', service_id=current_service.id), url_for('.template_usage', service_id=current_service.id),
'See templates used by month' 'See templates used by month',
with_border=False
) }} ) }}
</div> </div>
{% endif %} {% endif %}
+15 -17
View File
@@ -222,11 +222,11 @@ def test_inbound_messages_shows_count_of_messages_when_there_are_messages(
'main.service_dashboard', 'main.service_dashboard',
service_id=SERVICE_ONE_ID, service_id=SERVICE_ONE_ID,
) )
banner = page.select_one('a.banner-dashboard')
assert normalize_spaces( assert normalize_spaces(
page.select('.big-number-meta-wrapper')[0].text banner.text
) == '99 text messages received latest message just now' ) == '9,999 text messages received latest message just now'
assert page.select('.big-number-meta-wrapper a')[0]['href'] == url_for( assert banner['href'] == url_for(
'main.inbox', service_id=SERVICE_ONE_ID 'main.inbox', service_id=SERVICE_ONE_ID
) )
@@ -248,9 +248,9 @@ def test_inbound_messages_shows_count_of_messages_when_there_are_no_messages(
'main.service_dashboard', 'main.service_dashboard',
service_id=SERVICE_ONE_ID, service_id=SERVICE_ONE_ID,
) )
banner = page.select_one('a.banner-dashboard')
assert normalize_spaces(page.select('.big-number-meta-wrapper')[0].text) == '0 text messages received' assert normalize_spaces(banner.text) == '0 text messages received'
assert page.select('.big-number-meta-wrapper a')[0]['href'] == url_for( assert banner['href'] == url_for(
'main.inbox', service_id=SERVICE_ONE_ID 'main.inbox', service_id=SERVICE_ONE_ID
) )
@@ -553,7 +553,7 @@ def test_should_not_show_recent_templates_on_dashboard_if_only_one_template_used
expected_count = stats[0]['count'] expected_count = stats[0]['count']
assert expected_count == 50 assert expected_count == 50
assert normalize_spaces( assert normalize_spaces(
page.select_one('#total-sms .big-number').text page.select_one('#total-sms .big-number-smaller').text
) == ( ) == (
'{} text messages sent'.format(expected_count) '{} text messages sent'.format(expected_count)
) )
@@ -713,14 +713,13 @@ def test_should_show_upcoming_jobs_on_dashboard(
['email', 'sms'], ['email', 'sms'],
['email', 'sms', 'letter'], ['email', 'sms', 'letter'],
)) ))
@pytest.mark.parametrize('totals, big_number_class', [ @pytest.mark.parametrize('totals', [
( (
{ {
'email': {'requested': 0, 'delivered': 0, 'failed': 0}, 'email': {'requested': 0, 'delivered': 0, 'failed': 0},
'sms': {'requested': 99999, 'delivered': 0, 'failed': 0}, 'sms': {'requested': 99999, 'delivered': 0, 'failed': 0},
'letter': {'requested': 99999, 'delivered': 0, 'failed': 0} 'letter': {'requested': 99999, 'delivered': 0, 'failed': 0}
}, },
'.big-number',
), ),
( (
{ {
@@ -728,7 +727,6 @@ def test_should_show_upcoming_jobs_on_dashboard(
'sms': {'requested': 0, 'delivered': 0, 'failed': 0}, 'sms': {'requested': 0, 'delivered': 0, 'failed': 0},
'letter': {'requested': 100000, 'delivered': 0, 'failed': 0}, 'letter': {'requested': 100000, 'delivered': 0, 'failed': 0},
}, },
'.big-number-smaller',
), ),
]) ])
def test_correct_font_size_for_big_numbers( def test_correct_font_size_for_big_numbers(
@@ -743,7 +741,6 @@ def test_correct_font_size_for_big_numbers(
service_one, service_one,
permissions, permissions,
totals, totals,
big_number_class,
): ):
service_one['permissions'] = permissions service_one['permissions'] = permissions
@@ -758,11 +755,12 @@ def test_correct_font_size_for_big_numbers(
service_id=service_one['id'], service_id=service_one['id'],
) )
assert len(page.select_one('[data-key=totals]').select('.column-third')) == 3 assert (
assert len(page.select_one('[data-key=usage]').select('.column-third')) == 3 len(page.select_one('[data-key=totals]').select('.column-third'))
) == (
assert len( len(page.select_one('[data-key=usage]').select('.column-third'))
page.select('.big-number-with-status {}'.format(big_number_class)) ) == (
len(page.select('.big-number-with-status .big-number-smaller'))
) == 3 ) == 3
+1 -1
View File
@@ -1960,7 +1960,7 @@ def mock_get_inbound_sms_summary(mocker):
service_id, service_id,
): ):
return { return {
'count': 99, 'count': 9999,
'most_recent': datetime.utcnow().isoformat() 'most_recent': datetime.utcnow().isoformat()
} }