From 3a96d669a46f2fffc9623fae96cea4048823a039 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 00:27:51 +0000 Subject: [PATCH 1/2] Implement comprehensive WCAG 2.1 AA accessibility improvements - Make skip links visible on focus with proper styling - Add ARIA landmarks (banner, navigation, main, contentinfo, complementary) - Enhance form accessibility with aria-describedby, aria-invalid, aria-required - Add proper IDs to help text and error messages with role='alert' - Implement focus indicators for all interactive elements - Add aria-expanded attributes to collapsible menu items - Include accessibility JavaScript for focus management and announcements - Add screen reader only utility class (.sr-only) - Support reduced motion preferences - Add dir='ltr' attribute to html element - Enhance modal accessibility with proper ARIA attributes - Improve table accessibility with scope attributes and ARIA labels - Add proper heading hierarchy throughout templates - Include alt attributes for images with aria-hidden for decorative icons Co-Authored-By: Sam Fertig --- resources/assets/v2/src/js/accessibility.js | 72 +++++++++++++++++++++ resources/assets/v2/src/sass/app.scss | 68 ++++++++++++++++++- resources/views/form/checkbox.twig | 2 +- resources/views/form/date.twig | 4 +- resources/views/form/feedback.twig | 2 +- resources/views/form/file.twig | 2 +- resources/views/form/help.twig | 2 +- resources/views/form/integer.twig | 2 +- resources/views/form/multi-select.twig | 2 +- resources/views/form/password.twig | 2 +- resources/views/form/percentage.twig | 2 +- resources/views/form/select.twig | 2 +- resources/views/form/text.twig | 2 +- resources/views/form/textarea.twig | 2 +- resources/views/layout/default.twig | 25 ++++--- resources/views/partials/menu-sidebar.twig | 22 +++---- 16 files changed, 178 insertions(+), 35 deletions(-) create mode 100644 resources/assets/v2/src/js/accessibility.js diff --git a/resources/assets/v2/src/js/accessibility.js b/resources/assets/v2/src/js/accessibility.js new file mode 100644 index 00000000000..08f9b9b1891 --- /dev/null +++ b/resources/assets/v2/src/js/accessibility.js @@ -0,0 +1,72 @@ +document.addEventListener('DOMContentLoaded', function() { + const sidebarToggle = document.querySelector('.sidebar-toggle'); + if (sidebarToggle) { + sidebarToggle.addEventListener('click', function() { + const isExpanded = this.getAttribute('aria-expanded') === 'true'; + this.setAttribute('aria-expanded', !isExpanded); + }); + } + + const treeviewLinks = document.querySelectorAll('.treeview > a'); + treeviewLinks.forEach(function(link) { + link.addEventListener('click', function(e) { + e.preventDefault(); + const isExpanded = this.getAttribute('aria-expanded') === 'true'; + this.setAttribute('aria-expanded', !isExpanded); + + const submenu = this.nextElementSibling; + if (submenu && submenu.classList.contains('treeview-menu')) { + submenu.style.display = isExpanded ? 'none' : 'block'; + } + }); + }); + + const modals = document.querySelectorAll('.modal'); + modals.forEach(function(modal) { + modal.addEventListener('shown.bs.modal', function() { + const firstFocusable = modal.querySelector('input, button, select, textarea, [tabindex]:not([tabindex="-1"])'); + if (firstFocusable) { + firstFocusable.focus(); + } + }); + + modal.addEventListener('hidden.bs.modal', function() { + const trigger = document.querySelector('[data-target="#' + modal.id + '"]'); + if (trigger) { + trigger.focus(); + } + }); + }); + + function announceToScreenReader(message) { + const announcement = document.createElement('div'); + announcement.setAttribute('aria-live', 'polite'); + announcement.setAttribute('aria-atomic', 'true'); + announcement.className = 'sr-only'; + announcement.textContent = message; + document.body.appendChild(announcement); + + setTimeout(function() { + document.body.removeChild(announcement); + }, 1000); + } + + const forms = document.querySelectorAll('form'); + forms.forEach(function(form) { + form.addEventListener('submit', function(e) { + const errors = form.querySelectorAll('.text-danger[role="alert"]'); + if (errors.length > 0) { + announceToScreenReader('Form has ' + errors.length + ' error' + (errors.length > 1 ? 's' : '') + '. Please review and correct.'); + } + }); + }); + + document.addEventListener('keydown', function(e) { + if (e.key === 'Escape') { + const openModals = document.querySelectorAll('.modal.in, .modal.show'); + openModals.forEach(function(modal) { + $(modal).modal('hide'); + }); + } + }); +}); diff --git a/resources/assets/v2/src/sass/app.scss b/resources/assets/v2/src/sass/app.scss index 872e5bda2d6..8f9809e0247 100644 --- a/resources/assets/v2/src/sass/app.scss +++ b/resources/assets/v2/src/sass/app.scss @@ -48,7 +48,20 @@ $success: #64B624 !default; // some local CSS -.skip-links {display: none;} +.skip-links { + position: absolute; + left: -9999px; + z-index: 999999; + padding: 8px 16px; + background: #000; + color: #fff; + text-decoration: none; + border-radius: 3px; +} +.skip-links:focus { + left: 6px; + top: 7px; +} /* Remove bottom margin from unstyled lists @@ -80,6 +93,59 @@ h3.hover-expand:hover { appearance: auto; } +.form-control:focus { + outline: 2px solid #1E6581; + outline-offset: 2px; +} + +.btn:focus { + outline: 2px solid #1E6581; + outline-offset: 2px; +} + +a:focus { + outline: 2px solid #1E6581; + outline-offset: 2px; +} + +.sidebar-toggle:focus { + outline: 2px solid #1E6581; + outline-offset: 2px; +} + +.treeview > a:focus { + outline: 2px solid #1E6581; + outline-offset: 2px; +} + +.modal:focus { + outline: none; +} + +.modal-content { + outline: 2px solid #1E6581; +} + +@media (prefers-reduced-motion: reduce) { + * { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} + +.sr-only { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} + // edit buttons .hidden-edit-button { cursor: pointer; diff --git a/resources/views/form/checkbox.twig b/resources/views/form/checkbox.twig index 7e64d02030b..5002293407b 100644 --- a/resources/views/form/checkbox.twig +++ b/resources/views/form/checkbox.twig @@ -9,7 +9,7 @@
{% include 'form.help' %} diff --git a/resources/views/form/date.twig b/resources/views/form/date.twig index 68a14ecd646..d190c72ce12 100644 --- a/resources/views/form/date.twig +++ b/resources/views/form/date.twig @@ -5,10 +5,10 @@
- +
{{ Html.input('date', name, value).id(options.id).class('form-control').attribute('autocomplete','off').attribute('spellcheck','false') - .attribute('min', options.min) + .attribute('min', options.min).attribute('aria-describedby', (options.helpText ? name ~ '_help' : '') ~ (errors.has(name) ? ' ' ~ name ~ '_error' : '')).attribute('aria-invalid', errors.has(name) ? 'true' : 'false').attribute('aria-required', options.required ? 'true' : 'false') }}
{% include 'form.help' %} diff --git a/resources/views/form/feedback.twig b/resources/views/form/feedback.twig index 64d5875b838..55985cded3a 100644 --- a/resources/views/form/feedback.twig +++ b/resources/views/form/feedback.twig @@ -1,4 +1,4 @@ {% if errors.has(name) %} -

{{ errors.first(name) }}

+ {% endif %} diff --git a/resources/views/form/file.twig b/resources/views/form/file.twig index b45a4606bb1..9d586945a1e 100644 --- a/resources/views/form/file.twig +++ b/resources/views/form/file.twig @@ -2,7 +2,7 @@
- {{ Html.input('file',name).id(options.id).attribute('multiple','multiple').class('form-control') }} + {{ Html.input('file',name).id(options.id).attribute('multiple','multiple').class('form-control').attribute('aria-describedby', (options.helpText ? name ~ '_help' : '') ~ (errors.has(name) ? ' ' ~ name ~ '_error' : '')).attribute('aria-invalid', errors.has(name) ? 'true' : 'false').attribute('aria-required', options.required ? 'true' : 'false') }} {% include 'form.help' %} {% include 'form.feedback' %}
diff --git a/resources/views/form/help.twig b/resources/views/form/help.twig index d402fb623b6..33c9e87b333 100644 --- a/resources/views/form/help.twig +++ b/resources/views/form/help.twig @@ -1,3 +1,3 @@ {% if options.helpText %} -

{{ options.helpText|raw }}

+

{{ options.helpText|raw }}

{% endif %} diff --git a/resources/views/form/integer.twig b/resources/views/form/integer.twig index 924e339d6ca..c470c92175a 100644 --- a/resources/views/form/integer.twig +++ b/resources/views/form/integer.twig @@ -2,7 +2,7 @@
- {{ Html.input('number', name, value).id(options.id).attribute('step',options.step).attribute('autocomplete','off').attribute('spellcheck', 'false').class('form-control').attribute('placeholder',options.placeholder) }} + {{ Html.input('number', name, value).id(options.id).attribute('step',options.step).attribute('autocomplete','off').attribute('spellcheck', 'false').class('form-control').attribute('placeholder',options.placeholder).attribute('aria-describedby', (options.helpText ? name ~ '_help' : '') ~ (errors.has(name) ? ' ' ~ name ~ '_error' : '')).attribute('aria-invalid', errors.has(name) ? 'true' : 'false').attribute('aria-required', options.required ? 'true' : 'false') }} {% include 'form.help' %} {% include 'form.feedback' %}
diff --git a/resources/views/form/multi-select.twig b/resources/views/form/multi-select.twig index d21a4734b67..ee436e41671 100644 --- a/resources/views/form/multi-select.twig +++ b/resources/views/form/multi-select.twig @@ -2,7 +2,7 @@
- {{ Html.multiselect(name~"[]", list, selected).id(options.id).attribute('size',12).class('form-control').attribute('autocomplete','off').attribute('spellcheck','false').attribute('placeholder', options.placeholder) }} + {{ Html.multiselect(name~"[]", list, selected).id(options.id).attribute('size',12).class('form-control').attribute('autocomplete','off').attribute('spellcheck','false').attribute('placeholder', options.placeholder).attribute('aria-describedby', (options.helpText ? name ~ '_help' : '') ~ (errors.has(name) ? ' ' ~ name ~ '_error' : '')).attribute('aria-invalid', errors.has(name) ? 'true' : 'false').attribute('aria-required', options.required ? 'true' : 'false') }} {% include 'form.help' %} {% include 'form.feedback' %} diff --git a/resources/views/form/password.twig b/resources/views/form/password.twig index 7524a4bb2bc..1ea981ff512 100644 --- a/resources/views/form/password.twig +++ b/resources/views/form/password.twig @@ -2,7 +2,7 @@
- {{ Html.input('password', name, value).id(options.id).class('form-control').attribute('placeholder',options.placeholder).attribute('autocomplete','off').attribute('spellcheck','false') }} + {{ Html.input('password', name, value).id(options.id).class('form-control').attribute('placeholder',options.placeholder).attribute('autocomplete','off').attribute('spellcheck','false').attribute('aria-describedby', (options.helpText ? name ~ '_help' : '') ~ (errors.has(name) ? ' ' ~ name ~ '_error' : '')).attribute('aria-invalid', errors.has(name) ? 'true' : 'false').attribute('aria-required', options.required ? 'true' : 'false') }} {% include 'form.help' %} {% include 'form.feedback' %}
diff --git a/resources/views/form/percentage.twig b/resources/views/form/percentage.twig index d22ca11c17c..fcdcb844290 100644 --- a/resources/views/form/percentage.twig +++ b/resources/views/form/percentage.twig @@ -3,7 +3,7 @@
- {{ Html.input('number', name, value).id(options.id).attribute('step',options.step).attribute('autocomplete','off').attribute('spellcheck', 'false').class('form-control').attribute('placeholder',options.placeholder) }} + {{ Html.input('number', name, value).id(options.id).attribute('step',options.step).attribute('autocomplete','off').attribute('spellcheck', 'false').class('form-control').attribute('placeholder',options.placeholder).attribute('aria-describedby', (options.helpText ? name ~ '_help' : '') ~ (errors.has(name) ? ' ' ~ name ~ '_error' : '')).attribute('aria-invalid', errors.has(name) ? 'true' : 'false').attribute('aria-required', options.required ? 'true' : 'false') }}
%
{% include 'form.help' %} diff --git a/resources/views/form/select.twig b/resources/views/form/select.twig index bbd5588aec0..736f4aa3231 100644 --- a/resources/views/form/select.twig +++ b/resources/views/form/select.twig @@ -2,7 +2,7 @@
- {{ Html.select(name, list, selected).id(options.id).class('form-control').attribute('autocomplete','off').attribute('spellcheck','false').attribute('placeholder', options.placeholder) }} + {{ Html.select(name, list, selected).id(options.id).class('form-control').attribute('autocomplete','off').attribute('spellcheck','false').attribute('placeholder', options.placeholder).attribute('aria-describedby', (options.helpText ? name ~ '_help' : '') ~ (errors.has(name) ? ' ' ~ name ~ '_error' : '')).attribute('aria-invalid', errors.has(name) ? 'true' : 'false').attribute('aria-required', options.required ? 'true' : 'false') }} {% include 'form.help' %} {% include 'form.feedback' %} diff --git a/resources/views/form/text.twig b/resources/views/form/text.twig index e1a9e3e3413..339ba292cbb 100644 --- a/resources/views/form/text.twig +++ b/resources/views/form/text.twig @@ -2,7 +2,7 @@
- {{ Html.input('text', name, value).id(options.id).class('form-control').attribute('autocomplete','off').attribute('spellcheck','false').attribute('placeholder',options.placeholder) }} + {{ Html.input('text', name, value).id(options.id).class('form-control').attribute('autocomplete','off').attribute('spellcheck','false').attribute('placeholder',options.placeholder).attribute('aria-describedby', (options.helpText ? name ~ '_help' : '') ~ (errors.has(name) ? ' ' ~ name ~ '_error' : '')).attribute('aria-invalid', errors.has(name) ? 'true' : 'false').attribute('aria-required', options.required ? 'true' : 'false') }} {% include 'form.help' %} {% include 'form.feedback' %}
diff --git a/resources/views/form/textarea.twig b/resources/views/form/textarea.twig index d8f647db298..76a4bcb2712 100644 --- a/resources/views/form/textarea.twig +++ b/resources/views/form/textarea.twig @@ -2,7 +2,7 @@
- {{ Html.textarea(name, value).id(options.id).attribute('rows', options.rows).class('form-control').attribute('autocomplete','off').attribute('spellcheck','false').attribute('placeholder',options.placeholder) }} + {{ Html.textarea(name, value).id(options.id).attribute('rows', options.rows).class('form-control').attribute('autocomplete','off').attribute('spellcheck','false').attribute('placeholder',options.placeholder).attribute('aria-describedby', (options.helpText ? name ~ '_help' : '') ~ (errors.has(name) ? ' ' ~ name ~ '_error' : '')).attribute('aria-invalid', errors.has(name) ? 'true' : 'false').attribute('aria-required', options.required ? 'true' : 'false') }} {% include 'form.help' %} {% include 'form.feedback' %}
diff --git a/resources/views/layout/default.twig b/resources/views/layout/default.twig index a20ed1b0600..196f99163b3 100644 --- a/resources/views/layout/default.twig +++ b/resources/views/layout/default.twig @@ -1,5 +1,5 @@ - + +

{{ ('edit_' ~ objectType ~ '_account')|_ }}

+
@@ -23,7 +25,7 @@
-

{{ 'mandatoryFields'|_ }}

+

{{ 'mandatoryFields'|_ }}

{{ ExpandedForm.text('name', account.name) }} @@ -50,7 +52,7 @@
-

{{ 'optionalFields'|_ }}

+

{{ 'optionalFields'|_ }}

{{ ExpandedForm.text('iban', account.iban) }} @@ -87,7 +89,7 @@ {% if preFilled.account_role == 'ccAsset' %}
-

{{ 'credit_card_options'|_ }}

+

{{ 'credit_card_options'|_ }}

{{ ExpandedForm.select('cc_type',Config.get('firefly.ccTypes')) }} @@ -102,7 +104,7 @@ {# panel for options #}
-

{{ 'options'|_ }}

+

{{ 'options'|_ }}

{{ ExpandedForm.optionsList('update','account') }} diff --git a/resources/views/accounts/index.twig b/resources/views/accounts/index.twig index e8e12dd7a84..be92973aa51 100644 --- a/resources/views/accounts/index.twig +++ b/resources/views/accounts/index.twig @@ -10,9 +10,9 @@
-

+

{{ subTitle }} -

+
diff --git a/resources/views/accounts/reconcile/index.twig b/resources/views/accounts/reconcile/index.twig index 5cef87c7afd..1fdf6c01e90 100644 --- a/resources/views/accounts/reconcile/index.twig +++ b/resources/views/accounts/reconcile/index.twig @@ -10,14 +10,14 @@
-

{{ 'reconcile_range'|_ }}

+

{{ 'reconcile_range'|_ }}

- +
- - + + @@ -92,7 +92,7 @@
-

{{ 'reconcile_options'|_ }}

+

{{ 'reconcile_options'|_ }}

@@ -110,7 +110,7 @@
-

{{ 'transactions'|_ }}

+

{{ 'transactions'|_ }}

diff --git a/resources/views/accounts/reconcile/overview.twig b/resources/views/accounts/reconcile/overview.twig index 914a897bf60..9eabdd356a4 100644 --- a/resources/views/accounts/reconcile/overview.twig +++ b/resources/views/accounts/reconcile/overview.twig @@ -19,11 +19,18 @@ {% endfor %} -
{{ 'start_balance'|_ }}{{ 'end_balance'|_ }}{{ 'start_balance'|_ }}{{ 'end_balance'|_ }}
- - - - +
{{ 'submitted_start_balance'|_ }} ({{ start.isoFormat(monthAndDayFormat) }}){{ formatAmountByAccount(account, startBalance) }}
+ + + + + + + + + + + @@ -49,6 +56,7 @@ +
{{ 'description'|_ }}{{ 'amount'|_ }}
{{ 'submitted_start_balance'|_ }} ({{ start.isoFormat(monthAndDayFormat) }}){{ formatAmountByAccount(account, startBalance) }}
{{ trans('firefly.selected_transactions', {count: selectedIds|length}) }} {{ formatAmountByAccount(account, amount) }}

{% if diffCompare > 0 %} diff --git a/resources/views/accounts/reconcile/show.twig b/resources/views/accounts/reconcile/show.twig index bbcaaff3a14..e3324b00342 100644 --- a/resources/views/accounts/reconcile/show.twig +++ b/resources/views/accounts/reconcile/show.twig @@ -24,26 +24,26 @@

- +
- + - + {# total amount #} - + - + @@ -67,21 +67,21 @@

{{ 'transaction_journal_meta'|_ }}

-
{{ trans('list.type') }}{{ trans('list.type') }} {{ journal.transactiontype.type|_ }}
{{ trans('list.description') }}{{ trans('list.description') }} {{ journal.description }}
{{ 'total_amount'|_ }}{{ 'total_amount'|_ }} {{ formatAmountByAccount(transaction.account, transaction.amount) }}
{{ trans('list.date') }}{{ trans('list.date') }} {{ journal.date.isoFormat(monthAndDayFormat) }}
+
{# - + #} {% if journal.tags|length > 0 %} - + diff --git a/resources/views/accounts/reconcile/transactions.twig b/resources/views/accounts/reconcile/transactions.twig index be9cc0331f6..634e1ce9745 100644 --- a/resources/views/accounts/reconcile/transactions.twig +++ b/resources/views/accounts/reconcile/transactions.twig @@ -1,15 +1,15 @@ -
{{ 'categories'|_ }}{{ 'categories'|_ }} {{ journalCategories(journal)|raw }}
{{ 'tags'|_ }}{{ 'tags'|_ }} {% for tag in journal.tags %} -

+ {% if tag.tag_mode == 'nothing' %} {% endif %} @@ -92,7 +92,7 @@ {% endif %} {{ tag.tag }} -

+ {% endfor %}
+
- - - - - - - - - + + + + + + + + + diff --git a/resources/views/accounts/show.twig b/resources/views/accounts/show.twig index e2145c14655..166338b8472 100644 --- a/resources/views/accounts/show.twig +++ b/resources/views/accounts/show.twig @@ -10,7 +10,7 @@
-

+

{% if balances.balance %} {{ trans('firefly.chart_account_in_period', { balance: formatAmountBySymbol(balances.balance, currency.symbol, currency.decimal_places, true), @@ -20,7 +20,7 @@ balance: formatAmountBySymbol(balances.pc_balance, primaryCurrency.symbol, primaryCurrency.decimal_places, true), name: account.name|escape, start: start.isoFormat(monthAndDayFormat), end: end.isoFormat(monthAndDayFormat) })|raw }} {% endif %} -

+
{{ trans('list.description') }}{{ trans('list.amount') }}{{ trans('list.description') }}{{ trans('list.amount') }}
+
- - - - - - + + + + + + diff --git a/resources/views/bills/create.twig b/resources/views/bills/create.twig index cdab3ccef11..8522bebaa10 100644 --- a/resources/views/bills/create.twig +++ b/resources/views/bills/create.twig @@ -6,6 +6,8 @@ {% block content %} +

{{ 'create_new_bill'|_ }}

+ @@ -13,7 +15,7 @@
-

{{ 'mandatoryFields'|_ }}

+

{{ 'mandatoryFields'|_ }}

{{ ExpandedForm.text('name') }} @@ -30,7 +32,7 @@
-

{{ 'optionalFields'|_ }}

+

{{ 'optionalFields'|_ }}

{{ ExpandedForm.date('bill_end_date',null, {'helpText': trans('firefly.bill_end_date_help')}) }} @@ -49,7 +51,7 @@ {# panel for options #}
-

{{ 'options'|_ }}

+

{{ 'options'|_ }}

{{ ExpandedForm.optionsList('create','bill') }} diff --git a/resources/views/bills/delete.twig b/resources/views/bills/delete.twig index b0a59c80798..40e098066ef 100644 --- a/resources/views/bills/delete.twig +++ b/resources/views/bills/delete.twig @@ -12,7 +12,7 @@
-

{{ trans('form.delete_bill', {'name': bill.name}) }}

+

{{ trans('form.delete_bill', {'name': bill.name}) }}

diff --git a/resources/views/bills/edit.twig b/resources/views/bills/edit.twig index 46206470392..a2f52e1ee44 100644 --- a/resources/views/bills/edit.twig +++ b/resources/views/bills/edit.twig @@ -6,6 +6,8 @@ {% block content %} +

{{ 'edit_bill'|_ }}: {{ bill.name }}

+ @@ -15,7 +17,7 @@
-

{{ 'mandatoryFields'|_ }}

+

{{ 'mandatoryFields'|_ }}

{% if rules.count() > 0 %} @@ -37,7 +39,7 @@
-

{{ 'optionalFields'|_ }}

+

{{ 'optionalFields'|_ }}

{{ ExpandedForm.date('bill_end_date',null, {'helpText': trans('firefly.bill_end_date_help')}) }} @@ -57,7 +59,7 @@
-

{{ 'options'|_ }}

+

{{ 'options'|_ }}

{{ ExpandedForm.optionsList('update','bill') }} diff --git a/resources/views/bills/index.twig b/resources/views/bills/index.twig index 49a2905d5d0..409459925af 100644 --- a/resources/views/bills/index.twig +++ b/resources/views/bills/index.twig @@ -12,7 +12,7 @@
-

{{ title }}

+

{{ title }}

diff --git a/resources/views/bills/show.twig b/resources/views/bills/show.twig index ec55e972209..ecfcb969e40 100644 --- a/resources/views/bills/show.twig +++ b/resources/views/bills/show.twig @@ -10,7 +10,7 @@
-

{{ object.data.name }}

+

{{ object.data.name }}

@@ -24,7 +24,8 @@
-
 {{ trans('list.file_name') }}{{ trans('list.file_size') }}{{ trans('list.file_type') }}{{ trans('list.attached_to') }}{{ trans('list.file_exists') }}{{ 'actions'|_ }}{{ trans('list.file_name') }}{{ trans('list.file_size') }}{{ trans('list.file_type') }}{{ trans('list.attached_to') }}{{ trans('list.file_exists') }}
+
+ - + - + - + - + +
{% set lowAmount = formatAmountByCurrency(object.data.currency,object.data.amount_min) %} @@ -42,7 +43,7 @@
{{ 'bill_is_active'|_ }}{{ 'bill_is_active'|_ }} {% if object.data.active %} {{ 'yes'|_ }} @@ -52,7 +53,7 @@
{{ 'next_expected_match'|_ }}{{ 'next_expected_match'|_ }} {% if object.data.pay_dates|length > 0 %} @@ -63,7 +64,7 @@
{{ trans('firefly.average_bill_amount_year', {year: year}) }}{{ trans('firefly.average_bill_amount_year', {year: year}) }} {% for avg in yearAverage %} {{ formatAmountBySymbol(avg.avg, avg.currency_symbol, avg.currency_decimal_places, true) }} @@ -77,7 +78,7 @@
{{ 'average_bill_amount_overall'|_ }}{{ 'average_bill_amount_overall'|_ }} {% for avg in overallAverage %} {{ formatAmountBySymbol(avg.avg, avg.currency_symbol, avg.currency_decimal_places, true) }} @@ -89,6 +90,7 @@ {% endfor %}