Files
notifications-admin/app/templates/views/check/column-errors.html
Alex Janousek 6f5750f095 Removed all govuk css (#2814)
* Removed all govuk css

* Updated reference files

* Removing govuk js

* Fixed casing for modules, removed unused page

* Got more reference images

* Updated template page

* Removed govuk padding util

* Updated hint to uswds hint

* More govuk cleanup

* Commiting backstopjs ref files

* Fixed all unit tests that broke due to brittleness around govuk styling

* Added new ref images

* Final removal of govuk

* Officially removed all govuk references

* Updated reference file

* Updated link to button

* UI modernization

* Cleanup

* removed govuk escaping tests since they are no longer needed

* Fix CodeQL security issue in escapeElementName function

- Escape backslashes first before other special characters
- Prevents potential double-escaping vulnerability
- Addresses CodeQL alert about improper string escaping

* Found more govuk removal. Fixed unit tests

* Add missing pipeline check to pre-commit

* updated test

* Updated e2e test

* More update to e2e test

* Fixed another e2e test

* Simple PR comments addressed

* More updates

* Updated backstop ref files

* Refactored folder selection for non-admins

* Updated redundant line

* Updated tests to include correct mocks

* Added more ref files

* Addressing carlos comments

* Addressing Carlo comments, cleanup of window initing

* More cleanup and addressing carlo comments

* Fixing a11 scan

* Fixed a few issues with javascript

* Fixed for pr

* Fixing e2e tests

* Tweaking e2e test

* Added more ref files and cleaned up urls.js

* Fixed bug with creating new template

* Removed brittle test - addressed code ql comment

* e2e race condition fix

* More e2e test fixes

* Updated e2e tests to not wait for text sent

* Updated test to not wait for button click response

* Made tear down more resilent if staging is down

* reverted e2e test to what was working before main merge

* Updated backstopRef images

* Updated gulp to include job-polling differently
2025-10-06 09:38:54 -04:00

227 lines
7.4 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{% extends "withnav_template.html" %}
{% from "components/banner.html" import banner_wrapper %}
{% from "components/radios.html" import radio_select %}
{% from "components/table.html" import list_table, field, text_field, index_field, hidden_field_heading %}
{% from "components/file-upload.html" import file_upload %}
{% from "components/components/back-link/macro.njk" import usaBackLink %}
{% block service_page_title %}
Error
{% endblock %}
{% block backLink %}
<!--hide back link for one-off sends because the user never created a csv file-->
{% if recipients|length == 1 and not recipients.allowed_to_send_to and not recipients.missing_column_headers %}
<!--do nothing-->
{% else %}
{{ usaBackLink({ "href": back_link }) }}
{% endif %}
{% endblock %}
{% block maincolumn_content %}
<div class="">
{# Alert for users of AT #}
<span id="upload-error" class="usa-sr-only">File upload failed</span>
{% call banner_wrapper(type='dangerous') %}
{% if recipients.too_many_rows %}
<div class="usa-alert usa-alert--error" role="alert">
<div class="usa-alert__body">
<h1 class="usa-alert__heading banner-title" data-module="track-error" data-error-type="Too many rows" data-error-label="{{ upload_id }}">Your file has too many rows</h1>
<p class="usa-alert__text">
Notify can process up to
{{ "{:,}".format(recipients.max_rows) }} rows at once. Your
file has {{ "{:,}".format(recipients|length) }} rows.
</p>
</div>
</div>
{% elif not count_of_recipients %}
<div class="usa-alert usa-alert--error" role="alert">
<div class="usa-alert__body">
<h1 class="usa-alert__heading banner-title" data-module="track-error" data-error-type="No rows"
data-error-label="{{ upload_id }}">Your file is missing some rows
</h1>
{% if recipients.missing_column_headers %}
<p class="usa-alert-text">
It needs at least one row of data, and {{ recipients.missing_column_headers | sort() | formatted_list(
prefix='a column called',
prefix_plural='columns called'
) }}.
</p>
{% else %}
<p class="usa-alert-text">
It needs at least one row of data.
</p>
{% endif %}
</div>
</div>
{% elif not recipients.has_recipient_columns %}
<div class="usa-alert usa-alert--error" role="alert">
<div class="usa-alert__body">
<h1 class="usa-alert__heading banner-title" data-module="track-error" data-error-type="Missing recipient columns"
data-error-label="{{ upload_id }}">There's a problem with your column names</h1>
<p class="usa-alert-text">
Your file needs a column called {{ first_recipient_column }}.
</p>
<p class="usa-alert-text">
Right now it has {{ recipients.column_headers | formatted_list(
prefix='one column, called ',
prefix_plural='columns called '
) }}.
</p>
</div>
</div>
{% elif recipients.duplicate_recipient_column_headers %}
<div class="usa-alert usa-alert--error" role="alert">
<div class="usa-alert__body">
<h1 class="usa-alert__heading banner-title" data-module="track-error" data-error-type="Duplicate recipient columns"
data-error-label="{{ upload_id }}">There's a problem with your column names</h1>
<p class="usa-alert__text">
We found more than one column called {{ (
recipients.duplicate_recipient_column_headers
) | formatted_list(
conjunction='or',
prefix='',
prefix_plural=''
) }}.
</p>
<p class="usa-alert__text">
Delete or rename one of these columns and try again.
</p>
</div>
</div>
{% elif recipients.missing_column_headers %}
<div class="usa-alert usa-alert--error" role="alert">
<div class="usa-alert__body">
<h1 class="usa-alert__heading banner-title" data-module="track-error" data-error-type="Missing placeholder columns"
data-error-label="{{ upload_id }}">Your column names need to match the double parenthesis in your template</h1>
<p class="usa-alert__text">
Your file is missing {{ recipients.missing_column_headers | formatted_list(
conjunction='and',
prefix='a column called ',
prefix_plural='columns called '
) }}.
</p>
</div>
</div>
{% elif sent_previously %}
{% include "partials/check/sent-previously.html" %}
{% elif not recipients.allowed_to_send_to %}
{% with
count_of_recipients=count_of_recipients,
template_type_label=recipients.recipient_column_headers[0]
%}
{% include "partials/check/not-allowed-to-send-to.html" %}
{% endwith %}
{% elif recipients.more_rows_than_can_send %}
{% include "partials/check/too-many-messages.html" %}
{% endif %}
{% endcall %}
</div>
<!--hide the upload button and back to top link for one off sends-->
{% if recipients|length == 1 and not recipients.allowed_to_send_to and not recipients.missing_column_headers %}
<!-- do nothing -->
{% else %}
<div class="js-stick-at-top-when-scrolling">
<div class="form-group">
{% if not request.args.from_test %}
{{ file_upload(
form.file,
allowed_file_extensions=allowed_file_extensions,
action=url_for('.send_messages', service_id=current_service.id, template_id=template.id),
button_text='Upload your file again'
) }}
{% endif %}
</div>
<a href="#content" class="usa-link back-to-top-link display-block margin-top-2">Back to top</a>
</div>
{% endif %}
{% if not request.args.from_test %}
{% set column_headers = recipients._raw_column_headers if recipients.duplicate_recipient_column_headers else
recipients.column_headers %}
<h2 class="font-body-lg" id="file-preview">{{ original_file_name }}</h2>
<div class="fullscreen-content" data-module="fullscreen-table">
{% call(item, row_number) list_table(
recipients.displayed_rows,
caption=original_file_name,
caption_visible=False,
field_headings=[
'<span class="usa-sr-only">Row in file</span><span aria-hidden="true">1</span>'|safe
] + column_headers
) %}
{% call index_field() %}
<span>
{% set displayed_index = item.index + 2 %}
{{ displayed_index }}
</span>
{% endcall %}
{% for column in column_headers %}
{% if item[column].error and not recipients.missing_column_headers %}
{% call field() %}
<span>
<span class="table-field-error-label">{{ item[column].error }}</span>
{{ item[column].data if item[column].data != None }}
</span>
{% endcall %}
{% elif item[column].ignore %}
{{ text_field(item[column].data or '', status='default') }}
{% else %}
{{ text_field(item[column].data or '') }}
{% endif %}
{% endfor %}
{% if item[None].data %}
{% for column in item[None].data %}
{{ text_field(column, status='default') }}
{% endfor %}
{% endif %}
{% endcall %}
{% endif %}
</div>
{% if recipients.too_many_rows %}
<p class="table-show-more-link">
Only showing the first {{ count_of_displayed_recipients }} rows
</p>
{% elif count_of_displayed_recipients < count_of_recipients %} <p class="table-show-more-link">
{% if row_errors and not recipients.missing_column_headers %}
Only showing the first {{ count_of_displayed_recipients }} rows with errors
{% else %}
Only showing the first {{ count_of_displayed_recipients }} rows
{% endif %}
</p>
{% elif row_errors and not recipients.missing_column_headers %}
<p class="table-show-more-link">
Only showing rows with errors
</p>
{% endif %}
<h2 class="font-body-lg">Preview of {{ template.name }}</h2>
{{ template|string }}
{% endblock %}