Compare commits

..

506 Commits

Author SHA1 Message Date
ccostino
69c8bbc6b7 Merge pull request #2615 from GSA/poetry
upgrade poetry to 2.1.3
2025-05-30 11:50:27 -04:00
Carlo Costino
6a606a467e Update bootstrap-with-git-hooks command
Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-05-30 11:06:45 -04:00
ccostino
3d44e76383 Update .github/workflows/checks.yml
Removing extraneous vulnerability ignore config.
2025-05-30 10:57:24 -04:00
Kenneth Kehl
038f4e294a merge from main 2025-05-29 14:46:02 -07:00
Beverly Nguyen
9aa7138902 Merge pull request #2621 from GSA/2562-search-name-and-email-within-team-settings
Improving the UX on the team members page
2025-05-29 14:01:36 -07:00
Beverly Nguyen
86cd481786 Merge pull request #2625 from GSA/ui_issue
fix ui spacing
2025-05-29 14:00:54 -07:00
Beverly Nguyen
b3e09219a8 fix test 2025-05-29 13:02:48 -07:00
Beverly Nguyen
31293557ef -Previously, the template would show nothing if a user didn't have a name set. Now it falls back to displaying the email address.
-Added padding-x-2 class to the "Change details"
2025-05-29 12:17:59 -07:00
Kenneth Kehl
3fe74bea54 add exclusion 2025-05-29 11:25:01 -07:00
Kenneth Kehl
6aa84305f6 code review feedback 2025-05-29 11:19:22 -07:00
Kenneth Kehl
06f0eaa3c7 change to padding class 2025-05-29 10:38:37 -07:00
Beverly Nguyen
5c927d009b Merge branch 'main' into 2562-search-name-and-email-within-team-settings 2025-05-29 09:51:59 -07:00
Alex Janousek
bbd19bb513 Merge pull request #2624 from GSA/dependabot/pip/phonenumbers-9.0.6
Bump phonenumbers from 9.0.5 to 9.0.6
2025-05-29 12:36:33 -04:00
Kenneth Kehl
8b2139727e add README comments about poetry upgrades 2025-05-29 08:49:38 -07:00
Kenneth Kehl
e95740b52b fix ui spacing 2025-05-29 07:14:32 -07:00
dependabot[bot]
bb90f81571 Bump phonenumbers from 9.0.5 to 9.0.6
Bumps [phonenumbers](https://github.com/daviddrysdale/python-phonenumbers) from 9.0.5 to 9.0.6.
- [Commits](https://github.com/daviddrysdale/python-phonenumbers/compare/v9.0.5...v9.0.6)

---
updated-dependencies:
- dependency-name: phonenumbers
  dependency-version: 9.0.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-29 09:44:21 +00:00
Alex Janousek
45ce6d8e8e Merge pull request #2623 from GSA/dependabot/pip/redis-6.2.0
Bump redis from 6.1.0 to 6.2.0
2025-05-29 05:42:18 -04:00
Beverly Nguyen
f824549e18 Merge pull request #2622 from GSA/ignore-redis-false-report
Updated pip-audit ignore-vulns
2025-05-28 17:49:19 -07:00
dependabot[bot]
dabba6b696 Bump redis from 6.1.0 to 6.2.0
Bumps [redis](https://github.com/redis/redis-py) from 6.1.0 to 6.2.0.
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v6.1.0...v6.2.0)

---
updated-dependencies:
- dependency-name: redis
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-28 23:53:56 +00:00
Carlo Costino
ba0daeaf76 Updated pip-audit ignore-vulns
This changeset updates the PYSEC notices to ignore to due versions that either cannot be fixed or are false positives.  Specifically, this changeset removes previously ignored vulnerability reports and adds PYSEC-2023-312 to the list because it is a false positive and refers to Redis itself, not the Python Redis client (see https://github.com/pypa/advisory-database/issues/237 for details).

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-05-28 17:37:04 -04:00
Beverly Nguyen
9bd81fa314 Removed margin 2025-05-28 12:02:24 -07:00
Beverly Nguyen
f5690c3384 Added a "No results found" 2025-05-28 11:59:54 -07:00
Alex Janousek
e950e87ded Merge pull request #2620 from GSA/dependabot/npm_and_yarn/babel/core-7.27.3
Bump @babel/core from 7.27.1 to 7.27.3
2025-05-28 10:00:26 -04:00
Alex Janousek
32eb6c1e8f Merge pull request #2619 from GSA/dependabot/pip/pytest-mock-3.14.1
Bump pytest-mock from 3.14.0 to 3.14.1
2025-05-28 10:00:15 -04:00
Alex Janousek
39b9cc08a3 Merge pull request #2618 from GSA/dependabot/pip/moto-5.1.5
Bump moto from 5.1.4 to 5.1.5
2025-05-28 10:00:05 -04:00
dependabot[bot]
2d92038f53 Bump @babel/core from 7.27.1 to 7.27.3
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.27.1 to 7.27.3.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.3/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-version: 7.27.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-27 23:59:32 +00:00
dependabot[bot]
8aa074114e Bump pytest-mock from 3.14.0 to 3.14.1
Bumps [pytest-mock](https://github.com/pytest-dev/pytest-mock) from 3.14.0 to 3.14.1.
- [Release notes](https://github.com/pytest-dev/pytest-mock/releases)
- [Changelog](https://github.com/pytest-dev/pytest-mock/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-mock/compare/v3.14.0...v3.14.1)

---
updated-dependencies:
- dependency-name: pytest-mock
  dependency-version: 3.14.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-27 23:41:12 +00:00
dependabot[bot]
e1e9ba691b Bump moto from 5.1.4 to 5.1.5
Bumps [moto](https://github.com/getmoto/moto) from 5.1.4 to 5.1.5.
- [Release notes](https://github.com/getmoto/moto/releases)
- [Changelog](https://github.com/getmoto/moto/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getmoto/moto/compare/5.1.4...5.1.5)

---
updated-dependencies:
- dependency-name: moto
  dependency-version: 5.1.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-27 23:40:15 +00:00
Kenneth Kehl
665d7b543b upgrade poetry to 2.1.3 2025-05-27 12:44:28 -07:00
Kenneth Kehl
7ba4f3658e upgrade poetry to 2.1.3 2025-05-27 12:32:54 -07:00
Kenneth Kehl
0afc93958c upgrade poetry to 2.1.3 2025-05-27 12:25:52 -07:00
Kenneth Kehl
d27bc213d4 upgrade poetry to 2.1.3 2025-05-27 12:00:46 -07:00
Kenneth Kehl
589c01ed75 upgrade poetry to 2.1.3 2025-05-27 11:41:33 -07:00
Kenneth Kehl
29db4dcf4d upgrade poetry to 2.1.3 2025-05-27 11:34:11 -07:00
Alex Janousek
0ad1b09763 Merge pull request #2609 from GSA/dependabot/pip/cachetools-6.0.0
Bump cachetools from 5.5.2 to 6.0.0
2025-05-27 14:06:17 -04:00
dependabot[bot]
e8e971ed87 Bump cachetools from 5.5.2 to 6.0.0
Bumps [cachetools](https://github.com/tkem/cachetools) from 5.5.2 to 6.0.0.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v5.5.2...v6.0.0)

---
updated-dependencies:
- dependency-name: cachetools
  dependency-version: 6.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-27 18:00:16 +00:00
Alex Janousek
30785f022c Merge pull request #2612 from GSA/dependabot/pip/freezegun-1.5.2
Bump freezegun from 1.5.1 to 1.5.2
2025-05-27 13:58:15 -04:00
dependabot[bot]
776dabc750 Bump freezegun from 1.5.1 to 1.5.2
Bumps [freezegun](https://github.com/spulec/freezegun) from 1.5.1 to 1.5.2.
- [Release notes](https://github.com/spulec/freezegun/releases)
- [Changelog](https://github.com/spulec/freezegun/blob/master/CHANGELOG)
- [Commits](https://github.com/spulec/freezegun/compare/1.5.1...1.5.2)

---
updated-dependencies:
- dependency-name: freezegun
  dependency-version: 1.5.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-27 17:52:22 +00:00
Alex Janousek
8be4538dbe Merge pull request #2608 from GSA/dependabot/npm_and_yarn/uswds/uswds-3.13.0
Bump @uswds/uswds from 3.12.0 to 3.13.0
2025-05-27 13:50:52 -04:00
Alex Janousek
0ea2043796 Merge pull request #2613 from GSA/dependabot/pip/pytest-xdist-3.7.0
Bump pytest-xdist from 3.6.1 to 3.7.0
2025-05-27 13:50:15 -04:00
Alex Janousek
0f0a593998 Merge pull request #2610 from GSA/dependabot/pip/coverage-7.8.2
Bump coverage from 7.8.1 to 7.8.2
2025-05-27 12:51:19 -04:00
Alex Janousek
3924029211 Merge pull request #2614 from GSA/dependabot/npm_and_yarn/rollup-4.41.1
Bump rollup from 4.41.0 to 4.41.1
2025-05-27 12:49:37 -04:00
ccostino
69cd75b7c0 Merge pull request #2607 from GSA/e2e
fix the download report end to end test
2025-05-27 11:11:13 -04:00
Kenneth Kehl
1c048e140c merge from main 2025-05-27 08:03:29 -07:00
Kenneth Kehl
abf7f1b4c7 revert poetry.lock 2025-05-27 08:01:06 -07:00
dependabot[bot]
ef6eeb6e2e Bump pytest-xdist from 3.6.1 to 3.7.0
Bumps [pytest-xdist](https://github.com/pytest-dev/pytest-xdist) from 3.6.1 to 3.7.0.
- [Release notes](https://github.com/pytest-dev/pytest-xdist/releases)
- [Changelog](https://github.com/pytest-dev/pytest-xdist/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-xdist/compare/v3.6.1...v3.7.0)

---
updated-dependencies:
- dependency-name: pytest-xdist
  dependency-version: 3.7.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-27 14:50:12 +00:00
ccostino
134dde7899 Merge pull request #2611 from GSA/dependabot/pip/cryptography-45.0.3
Bump cryptography from 45.0.2 to 45.0.3
2025-05-27 10:48:08 -04:00
dependabot[bot]
9f647e5e81 Bump rollup from 4.41.0 to 4.41.1
Bumps [rollup](https://github.com/rollup/rollup) from 4.41.0 to 4.41.1.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.41.0...v4.41.1)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.41.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-27 00:02:39 +00:00
dependabot[bot]
99b1ad6af3 Bump cryptography from 45.0.2 to 45.0.3
Bumps [cryptography](https://github.com/pyca/cryptography) from 45.0.2 to 45.0.3.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/45.0.2...45.0.3)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 45.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-26 23:58:36 +00:00
dependabot[bot]
044dc90f6e Bump coverage from 7.8.1 to 7.8.2
Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.8.1 to 7.8.2.
- [Release notes](https://github.com/nedbat/coveragepy/releases)
- [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst)
- [Commits](https://github.com/nedbat/coveragepy/compare/7.8.1...7.8.2)

---
updated-dependencies:
- dependency-name: coverage
  dependency-version: 7.8.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-23 23:56:56 +00:00
dependabot[bot]
3286e87096 Bump @uswds/uswds from 3.12.0 to 3.13.0
Bumps [@uswds/uswds](https://github.com/uswds/uswds) from 3.12.0 to 3.13.0.
- [Release notes](https://github.com/uswds/uswds/releases)
- [Commits](https://github.com/uswds/uswds/compare/v3.12.0...v3.13.0)

---
updated-dependencies:
- dependency-name: "@uswds/uswds"
  dependency-version: 3.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-23 23:31:27 +00:00
Kenneth Kehl
40ece121b1 e2e 2025-05-23 11:07:30 -07:00
Kenneth Kehl
94c465f78c e2e 2025-05-23 10:51:13 -07:00
Alex Janousek
067a5efdc1 Merge pull request #2605 from GSA/dependabot/npm_and_yarn/uswds/compile-1.3.1
Bump @uswds/compile from 1.2.2 to 1.3.1
2025-05-23 12:51:55 -04:00
ccostino
db885d14ec Merge pull request #2594 from GSA/sheevdave-patch-2
Update manual_qa_template.yml
2025-05-23 10:48:03 -04:00
Carlo Costino
757803312d Tweaked a couple more of the steps to be in line with the current sign in/out flow
Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-05-23 10:39:39 -04:00
dependabot[bot]
0ec9805bcc Bump @uswds/compile from 1.2.2 to 1.3.1
Bumps [@uswds/compile](https://github.com/uswds/uswds-compile) from 1.2.2 to 1.3.1.
- [Release notes](https://github.com/uswds/uswds-compile/releases)
- [Commits](https://github.com/uswds/uswds-compile/compare/v1.2.2...v1.3.1)

---
updated-dependencies:
- dependency-name: "@uswds/compile"
  dependency-version: 1.3.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-22 23:06:08 +00:00
ccostino
316e8d8807 Merge pull request #2598 from GSA/update_csp
updating csp and test
2025-05-22 15:20:56 -04:00
Beverly Nguyen
790fe2d6f9 update csp using variables and testing 2025-05-22 12:03:18 -07:00
Alex Janousek
c2c57e72d5 Merge pull request #2597 from GSA/dependabot/pip/coverage-7.8.1
Bump coverage from 7.8.0 to 7.8.1
2025-05-22 07:37:35 -04:00
Beverly Nguyen
444800fbda flake8 2025-05-21 17:23:30 -07:00
Beverly Nguyen
cb2ad27d1c updating csp and test 2025-05-21 17:03:35 -07:00
dependabot[bot]
1cbcc0b150 Bump coverage from 7.8.0 to 7.8.1
Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.8.0 to 7.8.1.
- [Release notes](https://github.com/nedbat/coveragepy/releases)
- [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst)
- [Commits](https://github.com/nedbat/coveragepy/compare/7.8.0...7.8.1)

---
updated-dependencies:
- dependency-name: coverage
  dependency-version: 7.8.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-21 23:19:49 +00:00
Sheev Davé
cc6d820277 Merge pull request #2596 from GSA/typo-fixes
Clean up typos
2025-05-21 14:10:26 -07:00
Carlo Costino
206247f543 Clean up typos
This changeset cleans up a variety of typos that were found and submitted in PR #2588; we cannot directly accept external contributions, but we appreciate the flagging of things like this!

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-05-21 17:01:01 -04:00
Sheev Davé
6cc152c07c Update manual_qa_template.yml
Deleted 2FA directions since that's directly managed by login.gov
2025-05-21 13:06:03 -07:00
Alex Janousek
45b4cdac56 Merge pull request #2585 from GSA/dependabot/pip/shapely-2.1.1
Bump shapely from 2.1.0 to 2.1.1
2025-05-21 14:51:29 -04:00
dependabot[bot]
0f9836aa8b Bump shapely from 2.1.0 to 2.1.1
Bumps [shapely](https://github.com/shapely/shapely) from 2.1.0 to 2.1.1.
- [Release notes](https://github.com/shapely/shapely/releases)
- [Changelog](https://github.com/shapely/shapely/blob/main/CHANGES.txt)
- [Commits](https://github.com/shapely/shapely/compare/2.1.0...2.1.1)

---
updated-dependencies:
- dependency-name: shapely
  dependency-version: 2.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-21 18:45:09 +00:00
ccostino
1634201150 Merge pull request #2592 from GSA/dependabot/pip/click-8.2.1
Bump click from 8.2.0 to 8.2.1
2025-05-21 14:43:10 -04:00
dependabot[bot]
8d880bdfec Bump click from 8.2.0 to 8.2.1
Bumps [click](https://github.com/pallets/click) from 8.2.0 to 8.2.1.
- [Release notes](https://github.com/pallets/click/releases)
- [Changelog](https://github.com/pallets/click/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/click/compare/8.2.0...8.2.1)

---
updated-dependencies:
- dependency-name: click
  dependency-version: 8.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-21 14:05:49 +00:00
Alex Janousek
98d1519844 Merge pull request #2584 from GSA/dependabot/pip/numpy-2.2.6
Bump numpy from 2.2.5 to 2.2.6
2025-05-21 10:03:42 -04:00
dependabot[bot]
c00e8c9ecd Bump numpy from 2.2.5 to 2.2.6
Bumps [numpy](https://github.com/numpy/numpy) from 2.2.5 to 2.2.6.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v2.2.5...v2.2.6)

---
updated-dependencies:
- dependency-name: numpy
  dependency-version: 2.2.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-20 21:28:43 +00:00
Alex Janousek
0713f69ec9 Merge pull request #2583 from GSA/dependabot/npm_and_yarn/rollup-4.41.0
Bump rollup from 4.40.2 to 4.41.0
2025-05-20 17:27:29 -04:00
Alex Janousek
26677f116f Merge pull request #2586 from GSA/dependabot/pip/cryptography-45.0.2
Bump cryptography from 44.0.3 to 45.0.2
2025-05-20 17:26:43 -04:00
ccostino
5dcf967941 Merge pull request #2582 from GSA/2581-adding-api_public_url-to-env
Add API_PUBLIC_URL environment variable for public API access
2025-05-20 16:27:51 -04:00
ccostino
e658ed2584 Merge pull request #2590 from GSA/update-dependabot
Updated review and assignee name for dependabot
2025-05-20 16:17:23 -04:00
Beverly Nguyen
1b6894139d Fix formatting 2025-05-20 10:27:07 -07:00
Beverly Nguyen
2459ecd715 Fix formatting 2025-05-20 10:26:54 -07:00
Beverly Nguyen
8079a95c7a fix testing 2025-05-20 10:17:31 -07:00
alexjanousekGSA
802bda5169 Merge branch 'main' into update-dependabot 2025-05-20 13:11:17 -04:00
alexjanousekGSA
3b8b38d6ad Updated review and assignee name for dependabot 2025-05-20 09:51:11 -04:00
Beverly Nguyen
bc2738a97a Added API_PUBLIC_URL to GitHub Secrets and updated deploy workflows with new API_PUBLIC_URL 2025-05-19 17:22:28 -07:00
dependabot[bot]
0a42b1202d Bump cryptography from 44.0.3 to 45.0.2
Bumps [cryptography](https://github.com/pyca/cryptography) from 44.0.3 to 45.0.2.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/44.0.3...45.0.2)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 45.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 23:23:01 +00:00
dependabot[bot]
a0b4a2124a Bump rollup from 4.40.2 to 4.41.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.40.2 to 4.41.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.40.2...v4.41.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.41.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 23:16:08 +00:00
Beverly Nguyen
3c1574d070 Add API_PUBLIC_URL environment variable for public API access
- Added API_PUBLIC_URL to deploy-config and manifest.yml
- Updated app config to load API_PUBLIC_URL from environment
- Used API_PUBLIC_URL in CSP configuration for connect-src
2025-05-19 14:41:41 -07:00
Beverly Nguyen
a7787cb919 Merge pull request #2578 from GSA/2568-css-cleanup
2568 - Clean up CSS
2025-05-19 10:06:32 -07:00
Alex Janousek
2a4d8abc26 Merge pull request #2580 from GSA/dependabot/npm_and_yarn/sass-embedded-1.89.0
Bump sass-embedded from 1.88.0 to 1.89.0
2025-05-19 12:47:46 -04:00
dependabot[bot]
17c12481c9 Bump sass-embedded from 1.88.0 to 1.89.0
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.88.0 to 1.89.0.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.88.0...1.89.0)

---
updated-dependencies:
- dependency-name: sass-embedded
  dependency-version: 1.89.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-16 23:52:24 +00:00
Jonathan Bobel
3788fe7a91 Update radioSelect.test.js 2025-05-15 12:48:01 -04:00
Jonathan Bobel
39682c4c50 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2568-css-cleanup 2025-05-15 12:28:17 -04:00
Alex Janousek
bca36e1d9b Merge pull request #2571 from GSA/dependabot/pip/click-8.2.0
Bump click from 8.1.8 to 8.2.0
2025-05-15 11:52:11 -04:00
dependabot[bot]
20fcf8fa3b Bump click from 8.1.8 to 8.2.0
Bumps [click](https://github.com/pallets/click) from 8.1.8 to 8.2.0.
- [Release notes](https://github.com/pallets/click/releases)
- [Changelog](https://github.com/pallets/click/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/click/compare/8.1.8...8.2.0)

---
updated-dependencies:
- dependency-name: click
  dependency-version: 8.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-15 15:45:45 +00:00
Alex Janousek
c8904e7d70 Merge pull request #2574 from GSA/dependabot/pip/exceptiongroup-1.3.0
Bump exceptiongroup from 1.2.2 to 1.3.0
2025-05-15 11:43:41 -04:00
dependabot[bot]
0e724eda99 Bump exceptiongroup from 1.2.2 to 1.3.0
Bumps [exceptiongroup](https://github.com/agronholm/exceptiongroup) from 1.2.2 to 1.3.0.
- [Release notes](https://github.com/agronholm/exceptiongroup/releases)
- [Changelog](https://github.com/agronholm/exceptiongroup/blob/main/CHANGES.rst)
- [Commits](https://github.com/agronholm/exceptiongroup/compare/1.2.2...1.3.0)

---
updated-dependencies:
- dependency-name: exceptiongroup
  dependency-version: 1.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-15 15:36:13 +00:00
Alex Janousek
6fc16db52b Merge pull request #2558 from GSA/2554-add-cancel-button-and-modal-to-preview-send-page
2554 add cancel button and modal to preview send page
2025-05-15 11:34:35 -04:00
Alex Janousek
23cb68e3bc Merge pull request #2567 from GSA/2211-update-language-regarding-auto-refresh
2211 - Update content to inform user of page refresh
2025-05-15 11:34:14 -04:00
Alex Janousek
d43bf48686 Merge pull request #2573 from GSA/dependabot/npm_and_yarn/sass-embedded-1.88.0
Bump sass-embedded from 1.87.0 to 1.88.0
2025-05-15 11:33:52 -04:00
Alex Janousek
9d57ac0294 Merge pull request #2577 from GSA/dependabot/pip/redis-6.1.0
Bump redis from 5.2.1 to 6.1.0
2025-05-15 11:31:49 -04:00
Jonathan Bobel
f8c47f0194 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2554-add-cancel-button-and-modal-to-preview-send-page 2025-05-14 17:01:56 -04:00
Jonathan Bobel
28f9c3d9ff Update radioSelect.js 2025-05-14 16:16:45 -04:00
ccostino
e8c0f985c7 Merge pull request #2576 from GSA/2570-bug-messages-are-not-being-sent-with-personalizationvariables
reverting PR #2484 because it breaks personalization
2025-05-14 13:14:56 -04:00
Beverly Nguyen
8aa7a63f55 reformatted 2025-05-14 10:08:02 -07:00
Beverly Nguyen
3f944e2447 flake8 2025-05-14 10:07:29 -07:00
Beverly Nguyen
bd884012d4 added a second test to preserve the \r\n formatting for line endings 2025-05-14 09:58:52 -07:00
Beverly Nguyen
ecbde5ab1f Merge branch 'main' into 2570-bug-messages-are-not-being-sent-with-personalizationvariables 2025-05-14 09:49:27 -07:00
Jonathan Bobel
33cfbe13dd Update test_manage_users.py 2025-05-14 11:07:12 -04:00
Jonathan Bobel
81db86b463 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2568-css-cleanup 2025-05-14 10:31:26 -04:00
dependabot[bot]
c5d8792161 Bump redis from 5.2.1 to 6.1.0
Bumps [redis](https://github.com/redis/redis-py) from 5.2.1 to 6.1.0.
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v5.2.1...v6.1.0)

---
updated-dependencies:
- dependency-name: redis
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-14 13:41:23 +00:00
Cliff Hill
3d07e6f898 Merge pull request #2575 from GSA/dependabot/pip/flask-3.1.1
Bump flask from 3.1.0 to 3.1.1
2025-05-14 09:39:14 -04:00
ccostino
1a1f9a2ab4 Merge pull request #2572 from GSA/dependabot/pip/newrelic-10.12.0
Bump newrelic from 10.11.0 to 10.12.0
2025-05-14 09:03:32 -04:00
Beverly Nguyen
4728ee20e8 reverting pr 2484 because it breaks personalization 2025-05-13 15:35:31 -07:00
dependabot[bot]
9e63f9b096 Bump flask from 3.1.0 to 3.1.1
Bumps [flask](https://github.com/pallets/flask) from 3.1.0 to 3.1.1.
- [Release notes](https://github.com/pallets/flask/releases)
- [Changelog](https://github.com/pallets/flask/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/flask/compare/3.1.0...3.1.1)

---
updated-dependencies:
- dependency-name: flask
  dependency-version: 3.1.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-13 20:43:45 +00:00
Jonathan Bobel
ecfde62648 2568 - Clean up CSS 2025-05-13 16:20:30 -04:00
dependabot[bot]
be0dcd103f Bump sass-embedded from 1.87.0 to 1.88.0
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.87.0 to 1.88.0.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.87.0...1.88.0)

---
updated-dependencies:
- dependency-name: sass-embedded
  dependency-version: 1.88.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-13 00:18:34 +00:00
dependabot[bot]
17544c4b98 Bump newrelic from 10.11.0 to 10.12.0
Bumps [newrelic](https://github.com/newrelic/newrelic-python-agent) from 10.11.0 to 10.12.0.
- [Release notes](https://github.com/newrelic/newrelic-python-agent/releases)
- [Commits](https://github.com/newrelic/newrelic-python-agent/compare/v10.11.0...v10.12.0)

---
updated-dependencies:
- dependency-name: newrelic
  dependency-version: 10.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-13 00:14:30 +00:00
ccostino
83515cd321 Merge pull request #2569 from GSA/pin-egress-proxy
Pin egress proxy release
2025-05-12 14:30:16 -04:00
Alex Janousek
d1d3a0d426 Merge pull request #2566 from GSA/dependabot/pip/phonenumbers-9.0.5
Bump phonenumbers from 9.0.4 to 9.0.5
2025-05-12 14:11:03 -04:00
Carlo Costino
8b6edf93db Pin egress proxy release
This changeset pins the egress proxy to a previous release to help troubleshoot a potential issue with the underlying Caddy server update.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-05-12 12:51:00 -04:00
Amy Ashida
f64a9a0072 Adding best practice doc 2025-05-09 15:47:52 -10:00
Jonathan Bobel
0ff42e4561 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2211-update-language-regarding-auto-refresh 2025-05-09 11:10:22 -04:00
Jonathan Bobel
80314ad76d Update test_jobs.py 2025-05-09 11:06:39 -04:00
dependabot[bot]
b017a3c1e6 Bump phonenumbers from 9.0.4 to 9.0.5
Bumps [phonenumbers](https://github.com/daviddrysdale/python-phonenumbers) from 9.0.4 to 9.0.5.
- [Commits](https://github.com/daviddrysdale/python-phonenumbers/compare/v9.0.4...v9.0.5)

---
updated-dependencies:
- dependency-name: phonenumbers
  dependency-version: 9.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-08 23:05:58 +00:00
ccostino
6193125492 Merge pull request #2564 from GSA/fix-noproxy
Update no_proxy environment variable
2025-05-08 18:01:09 -04:00
Carlo Costino
0b6e52349d Update no_proxy environment variable
This changeset updates the no_proxy environment variable to allow S3 through.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-05-08 17:04:24 -04:00
Jonathan Bobel
96cbebefed 2211 - Update content to inform user of page refresh 2025-05-08 14:33:36 -04:00
Jonathan Bobel
9b8d0c2b2f Update ok.html 2025-05-07 15:26:14 -04:00
Jonathan Bobel
abb3ba64d9 Updates to the cancel modal 2025-05-07 15:06:39 -04:00
Jonathan Bobel
be038daa0a Create notifyModal.test.js 2025-05-07 11:16:00 -04:00
Jonathan Bobel
abf822cf39 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2554-add-cancel-button-and-modal-to-preview-send-page 2025-05-07 11:15:58 -04:00
Jonathan Bobel
63d96d46b8 2554 - Adding cancel button to Send Message flow 2025-05-07 11:08:03 -04:00
Alex Janousek
5cd703eb2f Merge pull request #2555 from GSA/dependabot/npm_and_yarn/rollup-4.40.2
Bump rollup from 4.40.1 to 4.40.2
2025-05-07 10:01:28 -04:00
Alex Janousek
2c08d638a0 Merge pull request #2556 from GSA/dependabot/npm_and_yarn/babel/preset-env-7.27.2
Bump @babel/preset-env from 7.27.1 to 7.27.2
2025-05-07 10:01:02 -04:00
dependabot[bot]
b9e08a5bc8 Bump @babel/preset-env from 7.27.1 to 7.27.2
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.27.1 to 7.27.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.2/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-version: 7.27.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-06 23:43:29 +00:00
dependabot[bot]
540ee74243 Bump rollup from 4.40.1 to 4.40.2
Bumps [rollup](https://github.com/rollup/rollup) from 4.40.1 to 4.40.2.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.40.1...v4.40.2)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.40.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-06 23:43:12 +00:00
Alex Janousek
ac69799108 Merge pull request #2553 from GSA/bugfix/virtualenv-downgrade
Updating virtualenv to specific version
2025-05-06 11:36:31 -04:00
Carlo Costino
15dcf7474f Remove dotenv plugin line from other bootstrap command
Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-05-06 09:54:54 -04:00
alexjanousekGSA
39972c341a Moving dependency installation for dotenv plugin 2025-05-05 13:18:17 -04:00
alexjanousekGSA
5887c1cf5c Added virtualenv to pyproject 2025-05-05 13:13:31 -04:00
alexjanousekGSA
35176328ca Updating virtualenv to specific version 2025-05-05 13:09:03 -04:00
Alex Janousek
e64446f5be Merge pull request #2551 from GSA/dependabot/pip/cryptography-44.0.3
Bump cryptography from 44.0.2 to 44.0.3
2025-05-05 12:46:10 -04:00
dependabot[bot]
a9901fc951 Bump cryptography from 44.0.2 to 44.0.3
Bumps [cryptography](https://github.com/pyca/cryptography) from 44.0.2 to 44.0.3.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/44.0.2...44.0.3)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 44.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-04 20:14:36 +00:00
Alex Janousek
eb3780e5b6 Merge pull request #2552 from GSA/dependabot/pip/charset-normalizer-3.4.2
Bump charset-normalizer from 3.4.1 to 3.4.2
2025-05-04 16:12:40 -04:00
dependabot[bot]
d5131c61f9 Bump charset-normalizer from 3.4.1 to 3.4.2
Bumps [charset-normalizer](https://github.com/jawah/charset_normalizer) from 3.4.1 to 3.4.2.
- [Release notes](https://github.com/jawah/charset_normalizer/releases)
- [Changelog](https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jawah/charset_normalizer/compare/3.4.1...3.4.2)

---
updated-dependencies:
- dependency-name: charset-normalizer
  dependency-version: 3.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 23:47:26 +00:00
Alex Janousek
b9c50c1e5d Merge pull request #2424 from GSA/fix-existing-e2e-tests
Fix existing end-to-end tests
2025-05-02 14:04:47 -04:00
alexjanousekGSA
000b2b7819 Removed print 2025-05-02 12:00:17 -04:00
alexjanousekGSA
34ed31d611 Fixed unit tests 2025-05-02 11:59:13 -04:00
Alex Janousek
c844a6bed8 Merge pull request #2550 from GSA/dependabot/pip/newrelic-10.11.0
Bump newrelic from 10.10.0 to 10.11.0
2025-05-02 11:12:54 -04:00
alexjanousekGSA
566228d051 Updated unit test 2025-05-02 11:08:56 -04:00
alexjanousekGSA
f79bb3d95a Removed unneeded test 2025-05-02 11:06:43 -04:00
alexjanousekGSA
c87a5d6bc6 Fixing cicd build errors 2025-05-02 10:58:54 -04:00
alexjanousekGSA
7fef3fff26 Updated backstopjs test 2025-05-02 10:47:44 -04:00
alexjanousekGSA
eff92773cc e2e tests pass locally 2025-05-02 10:43:07 -04:00
dependabot[bot]
f771f2374d Bump newrelic from 10.10.0 to 10.11.0
Bumps [newrelic](https://github.com/newrelic/newrelic-python-agent) from 10.10.0 to 10.11.0.
- [Release notes](https://github.com/newrelic/newrelic-python-agent/releases)
- [Commits](https://github.com/newrelic/newrelic-python-agent/compare/v10.10.0...v10.11.0)

---
updated-dependencies:
- dependency-name: newrelic
  dependency-version: 10.11.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-01 23:24:27 +00:00
Beverly Nguyen
0e48ed2716 Merge pull request #2536 from GSA/2123-back-button-context
2123 back button context
2025-05-01 09:48:50 -07:00
alexjanousekGSA
149d8e3ce5 Merge branch 'main' into fix-existing-e2e-tests 2025-05-01 10:10:36 -04:00
Jonathan Bobel
e5dce090e6 Merge pull request #2519 from GSA/2516-remove-homepage-js
2515 - remove homepage.js
2025-05-01 10:10:11 -04:00
Jonathan Bobel
4b138711e2 Merge pull request #2521 from GSA/2517-remove-timeago-js
2517 - Removing timeago.js
2025-05-01 10:09:58 -04:00
Jonathan Bobel
824364f2b6 Merge pull request #2522 from GSA/2515-remove-autofocus-js
2515 - Remove autofocus.js
2025-05-01 10:02:26 -04:00
Carlo Costino
50bdf916ba Merge branch 'main' into fix-existing-e2e-tests 2025-05-01 09:45:23 -04:00
Alex Janousek
285bee3809 Merge pull request #2546 from GSA/dependabot/npm_and_yarn/babel/preset-env-7.27.1
Bump @babel/preset-env from 7.26.9 to 7.27.1
2025-05-01 09:40:49 -04:00
dependabot[bot]
8e28cdbb56 Bump @babel/preset-env from 7.26.9 to 7.27.1
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.26.9 to 7.27.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.1/packages/babel-preset-env)

---
updated-dependencies:
- dependency-name: "@babel/preset-env"
  dependency-version: 7.27.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-01 13:29:06 +00:00
ccostino
02023aa775 Merge pull request #2518 from GSA/2514-remove-colourPreview-js
2514 - Removing colourPreview.js
2025-05-01 09:27:51 -04:00
Alex Janousek
2adb87dfe4 Merge pull request #2548 from GSA/dependabot/pip/humanize-4.12.3
Bump humanize from 4.12.2 to 4.12.3
2025-05-01 09:27:36 -04:00
Alex Janousek
43548a823e Merge pull request #2547 from GSA/dependabot/npm_and_yarn/babel/core-7.27.1
Bump @babel/core from 7.26.10 to 7.27.1
2025-05-01 09:27:19 -04:00
dependabot[bot]
db4c02532a Bump humanize from 4.12.2 to 4.12.3
Bumps [humanize](https://github.com/python-humanize/humanize) from 4.12.2 to 4.12.3.
- [Release notes](https://github.com/python-humanize/humanize/releases)
- [Commits](https://github.com/python-humanize/humanize/compare/4.12.2...4.12.3)

---
updated-dependencies:
- dependency-name: humanize
  dependency-version: 4.12.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-30 23:29:10 +00:00
dependabot[bot]
598e5eca91 Bump @babel/core from 7.26.10 to 7.27.1
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.26.10 to 7.27.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.1/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-version: 7.27.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-30 23:25:17 +00:00
ccostino
b48377e4b4 Merge pull request #2544 from GSA/2543-troubleshoot-socketio
2543 troubleshoot socketio
2025-04-30 14:20:33 -04:00
Beverly Nguyen
ccdfd0c10e formating changes 2025-04-30 10:04:30 -07:00
Beverly Nguyen
0917ddaa23 replaced os.env with config 2025-04-30 10:03:17 -07:00
Alex Janousek
7fbed553aa Merge pull request #2539 from GSA/dependabot/pip/phonenumbers-9.0.4
Bump phonenumbers from 9.0.3 to 9.0.4
2025-04-30 12:03:56 -04:00
Alex Janousek
0710372db4 Merge pull request #2535 from GSA/dependabot/pip/newrelic-10.10.0
Bump newrelic from 10.9.0 to 10.10.0
2025-04-30 12:03:17 -04:00
Alex Janousek
db7d59c8c8 Merge pull request #2523 from GSA/dependabot/npm_and_yarn/playwright-1.52.0
Bump playwright from 1.51.1 to 1.52.0
2025-04-30 12:02:09 -04:00
dependabot[bot]
c5228d9557 Bump phonenumbers from 9.0.3 to 9.0.4
Bumps [phonenumbers](https://github.com/daviddrysdale/python-phonenumbers) from 9.0.3 to 9.0.4.
- [Commits](https://github.com/daviddrysdale/python-phonenumbers/compare/v9.0.3...v9.0.4)

---
updated-dependencies:
- dependency-name: phonenumbers
  dependency-version: 9.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-30 15:53:44 +00:00
Alex Janousek
eb2d4798bd Merge pull request #2542 from GSA/dependabot/pip/certifi-2025.4.26
Bump certifi from 2025.1.31 to 2025.4.26
2025-04-30 11:51:51 -04:00
dependabot[bot]
3ed99ccd45 Bump playwright from 1.51.1 to 1.52.0
Bumps [playwright](https://github.com/microsoft/playwright) from 1.51.1 to 1.52.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.51.1...v1.52.0)

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: 1.52.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-30 15:46:17 +00:00
Alex Janousek
b91e687d17 Merge pull request #2529 from GSA/dependabot/npm_and_yarn/sass-embedded-1.87.0
Bump sass-embedded from 1.86.3 to 1.87.0
2025-04-30 11:45:28 -04:00
Alex Janousek
5eb08b8042 Merge pull request #2541 from GSA/dependabot/npm_and_yarn/rollup-4.40.1
Bump rollup from 4.40.0 to 4.40.1
2025-04-30 11:45:14 -04:00
Alex Janousek
aa59ac1d9c Merge pull request #2511 from GSA/dependabot/npm_and_yarn/morphdom-2.7.5
Bump morphdom from 2.7.4 to 2.7.5
2025-04-30 11:44:57 -04:00
Beverly Nguyen
c825878c45 isort 2025-04-29 15:55:14 -07:00
Beverly Nguyen
e6b76486f4 testing fixed 2025-04-29 15:41:06 -07:00
Beverly Nguyen
69ae1ea0e1 appending api hosted urls to append to csp to allow for connections 2025-04-29 11:59:52 -07:00
Beverly Nguyen
b468620ead appending api hosted urls to append to csp to allow for connections 2025-04-29 11:59:06 -07:00
Jonathan Bobel
4279467b16 Update preview.html
Missed some test code
2025-04-29 12:27:01 -04:00
Jonathan Bobel
f0ff50eb63 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2123-back-button-context 2025-04-29 12:26:02 -04:00
Jonathan Bobel
86b4547499 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2515-remove-autofocus-js 2025-04-29 11:56:49 -04:00
dependabot[bot]
a6145bec19 Bump certifi from 2025.1.31 to 2025.4.26
Bumps [certifi](https://github.com/certifi/python-certifi) from 2025.1.31 to 2025.4.26.
- [Commits](https://github.com/certifi/python-certifi/compare/2025.01.31...2025.04.26)

---
updated-dependencies:
- dependency-name: certifi
  dependency-version: 2025.4.26
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-29 00:15:38 +00:00
dependabot[bot]
1c795253d4 Bump rollup from 4.40.0 to 4.40.1
Bumps [rollup](https://github.com/rollup/rollup) from 4.40.0 to 4.40.1.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.40.0...v4.40.1)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.40.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-29 00:07:27 +00:00
Jonathan Bobel
6c16482577 Update tour.py 2025-04-28 13:00:31 -04:00
Jonathan Bobel
bf03391b6d Update tour.py 2025-04-28 12:17:28 -04:00
Jonathan Bobel
e04806b1eb Update tour.py
Formatting
2025-04-28 11:59:48 -04:00
Jonathan Bobel
7410a00519 Update tour.py 2025-04-28 11:53:01 -04:00
Jonathan Bobel
fb20ea6e1c Update send.py 2025-04-28 11:23:00 -04:00
Jonathan Bobel
cd40580231 Working through some tests 2025-04-25 16:20:21 -04:00
ccostino
b78a430ef9 Merge pull request #2537 from GSA/remove-hint-text-and-country-code-reference
Remove hint text and country code reference
2025-04-25 15:22:26 -04:00
Jonathan Bobel
7a52290bb7 Update test_send.py 2025-04-25 11:42:05 -04:00
Jonathan Bobel
4b5fee0bba Update send-test.html 2025-04-25 11:41:13 -04:00
Jonathan Bobel
350526f4ad Update test_send.py 2025-04-25 11:39:10 -04:00
Jonathan Bobel
fb5f7d969e Update send.py 2025-04-25 10:35:25 -04:00
Jonathan Bobel
2d6afb7904 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2123-back-button-context 2025-04-25 10:27:25 -04:00
Jonathan Bobel
670d82b72c Adjusting back text for all steps in send message process 2025-04-25 10:23:28 -04:00
ccostino
ec7af325df Merge pull request #2530 from GSA/2401-add-in-flask-socketio-for-api-calls-rather-than-using-ajax
update deploy config
2025-04-25 09:45:54 -04:00
dependabot[bot]
23782a83d0 Bump newrelic from 10.9.0 to 10.10.0
Bumps [newrelic](https://github.com/newrelic/newrelic-python-agent) from 10.9.0 to 10.10.0.
- [Release notes](https://github.com/newrelic/newrelic-python-agent/releases)
- [Commits](https://github.com/newrelic/newrelic-python-agent/compare/v10.9.0...v10.10.0)

---
updated-dependencies:
- dependency-name: newrelic
  dependency-version: 10.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-24 23:13:17 +00:00
Beverly Nguyen
609c472cff Merge pull request #2532 from GSA/2531-add-case-study
case study added
2025-04-24 12:09:58 -07:00
Andrew Shumway
386b3f8348 Merge pull request #2505 from GSA/dependabot/pip/pyexcel-0.7.3
Bump pyexcel from 0.7.2 to 0.7.3
2025-04-23 15:28:07 -06:00
dependabot[bot]
8bf58cdca9 Bump pyexcel from 0.7.2 to 0.7.3
Bumps [pyexcel](https://github.com/pyexcel/pyexcel) from 0.7.2 to 0.7.3.
- [Release notes](https://github.com/pyexcel/pyexcel/releases)
- [Changelog](https://github.com/pyexcel/pyexcel/blob/dev/CHANGELOG.rst)
- [Commits](https://github.com/pyexcel/pyexcel/compare/v0.7.2...v0.7.3)

---
updated-dependencies:
- dependency-name: pyexcel
  dependency-version: 0.7.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-23 21:21:33 +00:00
Andrew Shumway
6b92941156 Merge pull request #2527 from GSA/dependabot/pip/moto-5.1.4
Bump moto from 5.1.3 to 5.1.4
2025-04-23 15:20:17 -06:00
Andrew Shumway
0ccbe17b3b Merge pull request #2528 from GSA/dependabot/pip/numpy-2.2.5
Bump numpy from 2.2.4 to 2.2.5
2025-04-23 15:19:33 -06:00
Beverly Nguyen
ae305227bb Merge pull request #2440 from GSA/2138-cancel-button-CSV
2138 - Change cancel button to uploading button for CSV
2025-04-23 12:01:06 -07:00
Beverly Nguyen
7130925b9a Merge pull request #2524 from GSA/2510-add-phone-number-instruction
2510 - Adding additional context to phone numbers
2025-04-23 11:56:05 -07:00
Beverly Nguyen
f484a9c432 case study added 2025-04-23 11:49:26 -07:00
ccostino
6f6402e36a Merge pull request #2499 from GSA/2481-landing-page-standalone-without-api
homepage can stand on it's own without api
2025-04-22 16:49:29 -04:00
Beverly Nguyen
714e5011c3 update deploy config 2025-04-22 12:26:43 -07:00
Beverly Nguyen
6bfa9ede76 isort and remove poetry 2025-04-22 12:09:00 -07:00
Beverly Nguyen
57023b3a3a Merge branch 'main' into 2481-landing-page-standalone-without-api 2025-04-22 12:08:34 -07:00
Jonathan Bobel
0e31d34672 Update fullscreenTable.js
typo
2025-04-22 12:48:03 -04:00
Jonathan Bobel
1b9e19072e Updating some of the full screen table code 2025-04-22 10:45:11 -04:00
dependabot[bot]
55dc8e31ca Bump morphdom from 2.7.4 to 2.7.5
Bumps [morphdom](https://github.com/patrick-steele-idem/morphdom) from 2.7.4 to 2.7.5.
- [Changelog](https://github.com/patrick-steele-idem/morphdom/blob/master/CHANGELOG.md)
- [Commits](https://github.com/patrick-steele-idem/morphdom/compare/v2.7.4...v2.7.5)

---
updated-dependencies:
- dependency-name: morphdom
  dependency-version: 2.7.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-22 14:04:19 +00:00
Cliff Hill
f9a08dffe0 Merge pull request #2526 from GSA/2525-bugfix-js-socket-io-connection-variable
Fix connection url
2025-04-22 09:34:17 -04:00
dependabot[bot]
f661ea39ca Bump sass-embedded from 1.86.3 to 1.87.0
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.86.3 to 1.87.0.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.86.3...1.87.0)

---
updated-dependencies:
- dependency-name: sass-embedded
  dependency-version: 1.87.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-21 23:39:54 +00:00
Beverly Nguyen
431dbb10dd remove header banner when site is down 2025-04-21 16:26:07 -07:00
dependabot[bot]
25524324c5 Bump numpy from 2.2.4 to 2.2.5
Bumps [numpy](https://github.com/numpy/numpy) from 2.2.4 to 2.2.5.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v2.2.4...v2.2.5)

---
updated-dependencies:
- dependency-name: numpy
  dependency-version: 2.2.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-21 23:17:11 +00:00
dependabot[bot]
5abc0a4c8e Bump moto from 5.1.3 to 5.1.4
Bumps [moto](https://github.com/getmoto/moto) from 5.1.3 to 5.1.4.
- [Release notes](https://github.com/getmoto/moto/releases)
- [Changelog](https://github.com/getmoto/moto/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getmoto/moto/compare/5.1.3...5.1.4)

---
updated-dependencies:
- dependency-name: moto
  dependency-version: 5.1.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-21 23:16:04 +00:00
Beverly Nguyen
3328853bd0 Fix connection url 2025-04-21 15:56:19 -07:00
Cliff Hill
d6baaebef8 Merge pull request #2441 from GSA/2401-add-in-flask-socketio-for-api-calls-rather-than-using-ajax
install socket io and replace ajax
2025-04-21 16:33:52 -04:00
Jonathan Bobel
b6a6ffb2ab Merge branch 'main' of https://github.com/GSA/notifications-admin into 2138-cancel-button-CSV 2025-04-21 16:03:43 -04:00
Jonathan Bobel
b01a62225e Fixing a test, updating content 2025-04-21 13:57:29 -04:00
Jonathan Bobel
522340f52b Update send-test.html
Fixing the case of the labels
2025-04-21 13:45:51 -04:00
Jonathan Bobel
fe42f5ef64 Allowing for a custom label on the first step 2025-04-21 12:12:09 -04:00
Jonathan Bobel
b4afcb07aa Fixing tests 2025-04-21 11:42:24 -04:00
Jonathan Bobel
5d3364a114 Adjusting input types 2025-04-18 15:11:07 -04:00
Jonathan Bobel
70b149476c 2510 - adding additional context to phone numbers 2025-04-18 14:51:22 -04:00
Beverly Nguyen
4a1ac9b85c removing logs 2025-04-18 11:45:18 -07:00
Beverly Nguyen
10c61440c9 fix testing 2025-04-18 11:27:07 -07:00
Beverly Nguyen
34fdf7a1ca fixed testing 2025-04-18 11:17:51 -07:00
Jonathan Bobel
20cbb0a8db Removing top alert, creating if/else for the larger alert on the home page 2025-04-18 10:42:17 -04:00
Jonathan Bobel
14024a28ca Merge branch '2481-landing-page-standalone-without-api' of https://github.com/GSA/notifications-admin into 2481-landing-page-standalone-without-api 2025-04-18 10:11:49 -04:00
Jonathan Bobel
280e348fa6 Update test_manage_users.py 2025-04-18 09:54:31 -04:00
Carlo Costino
72f36a4d15 Merge branch 'main' into 2401-add-in-flask-socketio-for-api-calls-rather-than-using-ajax 2025-04-18 07:52:11 -04:00
ccostino
0b866aa7a7 Merge pull request #2520 from GSA/bug-set-UAT-timezone-in-test
bug - Update activityChart.test.js
2025-04-18 07:51:23 -04:00
Beverly Nguyen
77e9475ed8 fixing templates 2025-04-17 15:04:50 -07:00
Beverly Nguyen
b4e239c9bb creating error page for tech difficulties 2025-04-17 15:01:22 -07:00
Jonathan Bobel
c016530a7d Update test_organizations.py 2025-04-17 15:38:27 -04:00
Jonathan Bobel
2779e398f6 Update _legacy-styles.scss 2025-04-17 14:49:11 -04:00
Beverly Nguyen
8dfa881f26 fix test 2025-04-17 11:48:55 -07:00
Jonathan Bobel
5f258cb699 2515 - Remove autofocus.js 2025-04-17 14:46:00 -04:00
Jonathan Bobel
a53df8998c Update gulpfile.js 2025-04-17 14:07:22 -04:00
Jonathan Bobel
e3843f33c6 Update package-lock.json 2025-04-17 13:58:45 -04:00
Jonathan Bobel
20e0dc6c3e 2517 - Removing timaago.js 2025-04-17 13:57:54 -04:00
Jonathan Bobel
e9029eef09 Update activityChart.test.js 2025-04-17 10:58:06 -04:00
Jonathan Bobel
d0d6113a05 2515 - remove homepage.js 2025-04-17 10:54:09 -04:00
Jonathan Bobel
232c6cb9e1 Update gulpfile.js 2025-04-17 10:29:24 -04:00
Jonathan Bobel
ed238bfe6f Removing colourPreview.js 2025-04-17 10:28:15 -04:00
Carlo Costino
a3eeeb2b2c Make a few adjustments to match changes to the API:
* Updates the Makefile so make test works (removed js-lint action for now)
* Addresses some outstanding linting/formatting
* Updates dependencies and pulls in latest changes from main

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-04-16 17:45:32 -04:00
Carlo Costino
54d8996e2a Merge branch 'main' into 2401-add-in-flask-socketio-for-api-calls-rather-than-using-ajax 2025-04-16 17:00:00 -04:00
Beverly Nguyen
88e9f1dec6 Fixing feature flag 2025-04-16 13:04:55 -07:00
Beverly Nguyen
7de1a9b944 Merge pull request #2508 from GSA/2497-bug-cannot-save-template-on-edit
Bug: Cannot save template on edit
2025-04-16 12:17:41 -07:00
Beverly Nguyen
b4a8eb7210 remove file that isn't needed 2025-04-16 11:39:39 -07:00
Beverly Nguyen
f975953aa7 fix template error dups 2025-04-16 11:32:10 -07:00
Jonathan Bobel
34b39acf38 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2481-landing-page-standalone-without-api 2025-04-16 11:23:07 -04:00
Jonathan Bobel
3e0e290dc0 Updated error message and imagery 2025-04-15 15:50:42 -04:00
Beverly Nguyen
8c32af4ee1 quick fix 2025-04-15 11:55:27 -07:00
Alex Janousek
5464da155a Merge pull request #2501 from GSA/dependabot/pip/phonenumbers-9.0.3
Bump phonenumbers from 9.0.2 to 9.0.3
2025-04-15 12:47:57 -04:00
Alex Janousek
01678ce67a Merge pull request #2504 from GSA/dependabot/npm_and_yarn/rollup-4.40.0
Bump rollup from 4.39.0 to 4.40.0
2025-04-15 12:47:21 -04:00
dependabot[bot]
67b7dc28b4 Bump rollup from 4.39.0 to 4.40.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.39.0 to 4.40.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.39.0...v4.40.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.40.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-14 23:37:01 +00:00
Beverly Nguyen
d4a2584dfb update logging 2025-04-14 14:51:55 -07:00
Beverly Nguyen
638a4f20da update logging 2025-04-14 14:49:19 -07:00
Beverly Nguyen
fbd70b7c38 Merge pull request #2503 from GSA/update-makefile
Update Makefile to handle pre-existing git hooks
2025-04-14 13:28:46 -07:00
Carlo Costino
06ce617f0a Create new command instead of trying to be fancy
Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-04-14 16:17:35 -04:00
Carlo Costino
1afe8121b8 Update Makefile to handle pre-existing git hooks
This changeset adds a bit of extra support to the bootstrap command to make sure that pre-existing git hooks do not interfere with the installation of the pre-commit git hooks.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-04-14 15:47:12 -04:00
dependabot[bot]
9d7b6d3147 Bump phonenumbers from 9.0.2 to 9.0.3
Bumps [phonenumbers](https://github.com/daviddrysdale/python-phonenumbers) from 9.0.2 to 9.0.3.
- [Commits](https://github.com/daviddrysdale/python-phonenumbers/compare/v9.0.2...v9.0.3)

---
updated-dependencies:
- dependency-name: phonenumbers
  dependency-version: 9.0.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-14 18:55:06 +00:00
ccostino
7b2d031591 Merge pull request #2500 from GSA/dependabot/pip/newrelic-10.9.0
Bump newrelic from 10.8.1 to 10.9.0
2025-04-14 14:53:10 -04:00
Kenneth Kehl
ae3be157e6 Merge pull request #2479 from GSA/intl_nums
Intl nums
2025-04-14 10:24:25 -07:00
Kenneth Kehl
16b1429eb0 merge from main 2025-04-14 07:54:42 -07:00
dependabot[bot]
64ac382af9 Bump newrelic from 10.8.1 to 10.9.0
Bumps [newrelic](https://github.com/newrelic/newrelic-python-agent) from 10.8.1 to 10.9.0.
- [Release notes](https://github.com/newrelic/newrelic-python-agent/releases)
- [Commits](https://github.com/newrelic/newrelic-python-agent/compare/v10.8.1...v10.9.0)

---
updated-dependencies:
- dependency-name: newrelic
  dependency-version: 10.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-11 23:48:35 +00:00
Beverly Nguyen
ca1e87a54b merge main 2025-04-11 13:34:32 -07:00
Beverly Nguyen
da695557b0 status banner added 2025-04-11 13:28:42 -07:00
Beverly Nguyen
3e18c8f595 keep landing page independent from api 2025-04-11 13:03:40 -07:00
Beverly Nguyen
d3e17c743b Merge pull request #2490 from GSA/sandbox_scan_fix 2025-04-11 09:39:39 -07:00
Beverly Nguyen
6d398f7301 test 2025-04-10 16:13:34 -07:00
Beverly Nguyen
e96f01f4a9 Merge branch 'main' into 2401-add-in-flask-socketio-for-api-calls-rather-than-using-ajax 2025-04-10 15:08:56 -07:00
Jonathan Bobel
9eec7cdba5 Merge pull request #2486 from GSA/2041-csv-upload-more-instructions
2041 csv upload more instructions
2025-04-10 16:31:14 -04:00
alexjanousekGSA
e59ddfcae5 Update unit test 2025-04-10 15:58:26 -04:00
Jonathan Bobel
38d8bdea0a Small content updates 2025-04-10 15:41:27 -04:00
Beverly Nguyen
f8eb512aab isort and flake8 2025-04-10 12:38:41 -07:00
Beverly Nguyen
6dd44fdc2d added feature flag 2025-04-10 12:35:04 -07:00
Jonathan Bobel
1967195da0 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2041-csv-upload-more-instructions 2025-04-10 15:20:26 -04:00
alexjanousekGSA
fb11fbfba3 Merged in main 2025-04-10 15:11:28 -04:00
alexjanousekGSA
17a7080f46 Fixing unit tests 2025-04-10 15:10:07 -04:00
alexjanousekGSA
a962da9c7d Added existing csp header 2025-04-10 12:15:34 -04:00
alexjanousekGSA
3a468c77aa Fixed unit test 2025-04-10 08:20:47 -04:00
Beverly Nguyen
d8ca53e08b clean up 2025-04-09 17:17:01 -07:00
Beverly Nguyen
bea926f103 install socket 2025-04-09 17:11:09 -07:00
Beverly Nguyen
6f8f7346ca merge main 2025-04-09 17:03:47 -07:00
Beverly Nguyen
8dbcc59726 socket setup 2025-04-09 16:57:42 -07:00
Kenneth Kehl
f3c3a60875 merge from main and fix test 2025-04-09 14:18:24 -07:00
Andrew Shumway
253934a495 Merge pull request #2472 from GSA/dependabot/pip/async-timeout-5.0.1
Bump async-timeout from 4.0.3 to 5.0.1
2025-04-08 11:06:07 -06:00
alexjanousekGSA
fff81870e5 Fixed header 2025-04-08 13:03:01 -04:00
Andrew Shumway
970483ef0b Merge pull request #2491 from GSA/dependabot/pip/pip-audit-2.9.0
Bump pip-audit from 2.8.0 to 2.9.0
2025-04-08 10:55:34 -06:00
ccostino
ba661a0c53 Merge pull request #2492 from GSA/dependabot/pip/moto-5.1.3
Bump moto from 5.1.2 to 5.1.3
2025-04-08 12:54:49 -04:00
dependabot[bot]
f5ce055079 Bump async-timeout from 4.0.3 to 5.0.1
Bumps [async-timeout](https://github.com/aio-libs/async-timeout) from 4.0.3 to 5.0.1.
- [Release notes](https://github.com/aio-libs/async-timeout/releases)
- [Changelog](https://github.com/aio-libs/async-timeout/blob/master/CHANGES.rst)
- [Commits](https://github.com/aio-libs/async-timeout/compare/v4.0.3...v5.0.1)

---
updated-dependencies:
- dependency-name: async-timeout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-08 16:51:40 +00:00
Andrew Shumway
29c2eafbd7 Merge pull request #2470 from GSA/dependabot/pip/markupsafe-3.0.2
Bump markupsafe from 2.1.5 to 3.0.2
2025-04-08 10:49:46 -06:00
dependabot[bot]
6ecbc7ebab Bump markupsafe from 2.1.5 to 3.0.2
Bumps [markupsafe](https://github.com/pallets/markupsafe) from 2.1.5 to 3.0.2.
- [Release notes](https://github.com/pallets/markupsafe/releases)
- [Changelog](https://github.com/pallets/markupsafe/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/markupsafe/compare/2.1.5...3.0.2)

---
updated-dependencies:
- dependency-name: markupsafe
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-08 16:07:13 +00:00
Andrew Shumway
f3688d62d5 Merge pull request #2471 from GSA/dependabot/pip/ago-0.1.0
Bump ago from 0.0.95 to 0.1.0
2025-04-08 10:05:06 -06:00
dependabot[bot]
1f13176fa6 Bump moto from 5.1.2 to 5.1.3
Bumps [moto](https://github.com/getmoto/moto) from 5.1.2 to 5.1.3.
- [Release notes](https://github.com/getmoto/moto/releases)
- [Changelog](https://github.com/getmoto/moto/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getmoto/moto/compare/5.1.2...5.1.3)

---
updated-dependencies:
- dependency-name: moto
  dependency-version: 5.1.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-08 01:11:50 +00:00
dependabot[bot]
09c6d0445d Bump pip-audit from 2.8.0 to 2.9.0
Bumps [pip-audit](https://github.com/pypa/pip-audit) from 2.8.0 to 2.9.0.
- [Release notes](https://github.com/pypa/pip-audit/releases)
- [Changelog](https://github.com/pypa/pip-audit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pypa/pip-audit/compare/v2.8.0...v2.9.0)

---
updated-dependencies:
- dependency-name: pip-audit
  dependency-version: 2.9.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-08 01:04:34 +00:00
dependabot[bot]
c328353e18 Bump ago from 0.0.95 to 0.1.0
---
updated-dependencies:
- dependency-name: ago
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-07 21:27:13 +00:00
Alex Janousek
e9e0601237 Merge pull request #2473 from GSA/dependabot/pip/phonenumbers-9.0.2
Bump phonenumbers from 8.13.55 to 9.0.2
2025-04-07 17:25:24 -04:00
dependabot[bot]
88f29a6727 Bump phonenumbers from 8.13.55 to 9.0.2
Bumps [phonenumbers](https://github.com/daviddrysdale/python-phonenumbers) from 8.13.55 to 9.0.2.
- [Commits](https://github.com/daviddrysdale/python-phonenumbers/compare/v8.13.55...v9.0.2)

---
updated-dependencies:
- dependency-name: phonenumbers
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-07 18:51:04 +00:00
Alex Janousek
9d4d55a670 Merge pull request #2474 from GSA/dependabot/pip/pyexcel-xlsx-0.6.1
Bump pyexcel-xlsx from 0.6.0 to 0.6.1
2025-04-07 14:49:07 -04:00
Alex Janousek
3211c5a16f Merge pull request #2476 from GSA/dependabot/npm_and_yarn/uswds/compile-1.2.2
Bump @uswds/compile from 1.2.1 to 1.2.2
2025-04-07 14:48:54 -04:00
Alex Janousek
9c8aa9c0e2 Merge pull request #2477 from GSA/dependabot/npm_and_yarn/rollup-4.39.0
Bump rollup from 4.38.0 to 4.39.0
2025-04-07 14:48:42 -04:00
Alex Janousek
c2508f7230 Merge pull request #2487 from GSA/dependabot/npm_and_yarn/sass-embedded-1.86.3
Bump sass-embedded from 1.86.1 to 1.86.3
2025-04-07 14:48:17 -04:00
alexjanousekGSA
b5675e586e Fixed security issue and noscript iframe 2025-04-07 14:45:28 -04:00
Jonathan Bobel
823b490331 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2041-csv-upload-more-instructions 2025-04-07 11:22:12 -04:00
dependabot[bot]
e69d6f807f Bump sass-embedded from 1.86.1 to 1.86.3
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.86.1 to 1.86.3.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.86.1...1.86.3)

---
updated-dependencies:
- dependency-name: sass-embedded
  dependency-version: 1.86.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-04 23:53:25 +00:00
ccostino
ee8213f670 Merge pull request #2485 from GSA/updating_assets_folder
updating asset folder
2025-04-04 14:57:47 -04:00
Beverly Nguyen
c43174be78 Merge pull request #2484 from GSA/corrupt_csv
fix blank lines at end of csv
2025-04-04 11:34:09 -07:00
Jonathan Bobel
548072fe66 Content and styling updates to CSV upload page 2025-04-04 14:33:11 -04:00
Beverly Nguyen
7f3e368427 updating asset folder 2025-04-04 11:29:53 -07:00
Beverly Nguyen
caed2ad5d6 updating asset folder 2025-04-04 11:27:20 -07:00
dependabot[bot]
3401b994cd Bump pyexcel-xlsx from 0.6.0 to 0.6.1
Bumps [pyexcel-xlsx](https://github.com/pyexcel/pyexcel-xlsx) from 0.6.0 to 0.6.1.
- [Release notes](https://github.com/pyexcel/pyexcel-xlsx/releases)
- [Changelog](https://github.com/pyexcel/pyexcel-xlsx/blob/dev/CHANGELOG.rst)
- [Commits](https://github.com/pyexcel/pyexcel-xlsx/compare/v0.6.0...v0.6.1)

---
updated-dependencies:
- dependency-name: pyexcel-xlsx
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-04 18:07:10 +00:00
Beverly Nguyen
d5798bb818 Merge pull request #2480 from GSA/2475-target-blank-error 2025-04-04 11:05:11 -07:00
Kenneth Kehl
0cf9abf5e8 add test 2025-04-04 09:35:01 -07:00
Kenneth Kehl
0bdf0cb073 fix blank lines at end of csv 2025-04-04 09:13:46 -07:00
Jonathan Bobel
b8b7c2df69 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2041-csv-upload-more-instructions 2025-04-04 11:29:31 -04:00
Beverly Nguyen
2ca7f5d2b0 Merge branch 'main' into 2401-add-in-flask-socketio-for-api-calls-rather-than-using-ajax 2025-04-03 15:30:02 -07:00
Jonathan Bobel
db37a4de94 Updating all links with a target="_blank" 2025-04-03 11:57:21 -04:00
Kenneth Kehl
b3b31d0732 merge from main 2025-04-03 07:45:06 -07:00
Kenneth Kehl
ef779daec1 reenable intl numbers 2025-04-03 07:44:21 -07:00
Jonathan Bobel
50df9c79a2 2475 - Update target="_blank" links 2025-04-03 10:37:50 -04:00
dependabot[bot]
e4a4217dba Bump rollup from 4.38.0 to 4.39.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.38.0 to 4.39.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.38.0...v4.39.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.39.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-02 23:55:21 +00:00
dependabot[bot]
3179471122 Bump @uswds/compile from 1.2.1 to 1.2.2
Bumps [@uswds/compile](https://github.com/uswds/uswds-compile) from 1.2.1 to 1.2.2.
- [Release notes](https://github.com/uswds/uswds-compile/releases)
- [Commits](https://github.com/uswds/uswds-compile/compare/v1.2.1...v1.2.2)

---
updated-dependencies:
- dependency-name: "@uswds/compile"
  dependency-version: 1.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-02 23:55:01 +00:00
Jonathan Bobel
f8c7f6b817 Merge conflict - poetry.lock 2025-04-02 11:44:39 -04:00
Jonathan Bobel
193184983d Changing alert back to a focus and fixing tests 2025-04-02 11:39:07 -04:00
Jonathan Bobel
38451d77ad Test updates, js fixes 2025-04-01 16:22:46 -04:00
Jonathan Bobel
032b9927aa Test updates 2025-04-01 13:03:12 -04:00
ccostino
82934daa02 Merge pull request #2469 from GSA/2262-add-copy-to-invite-a-team-member-page
Added additional copy
2025-04-01 12:58:14 -04:00
Alex Janousek
1c2c9fd57a Merge pull request #2466 from GSA/dependabot/pip/pytz-2025.2
Bump pytz from 2024.2 to 2025.2
2025-04-01 12:47:25 -04:00
dependabot[bot]
417356bc28 Bump pytz from 2024.2 to 2025.2
Bumps [pytz](https://github.com/stub42/pytz) from 2024.2 to 2025.2.
- [Release notes](https://github.com/stub42/pytz/releases)
- [Commits](https://github.com/stub42/pytz/compare/release_2024.2...release_2025.2)

---
updated-dependencies:
- dependency-name: pytz
  dependency-version: '2025.2'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 15:48:31 +00:00
Kenneth Kehl
f379e828de Merge pull request #2442 from GSA/mistune
Mistune
2025-04-01 08:46:38 -07:00
Kenneth Kehl
7a29252081 merge from main 2025-04-01 08:26:40 -07:00
Jonathan Bobel
06c238269f Update send.html
Fixing the back link
2025-04-01 11:02:08 -04:00
Kenneth Kehl
91f3e6a557 fix static scan warnings 2025-04-01 08:00:33 -07:00
Jonathan Bobel
2064fc864a Added an sr-only alert to the site for upload errors (and any other errors we might want to only announce to the screen reader) 2025-04-01 10:46:56 -04:00
alexjanousekGSA
273232df40 Added additional copy 2025-04-01 09:42:23 -04:00
Alex Janousek
c1e1e34a17 Merge pull request #2467 from GSA/dependabot/pip/werkzeug-3.1.3
Bump werkzeug from 3.0.6 to 3.1.3
2025-04-01 09:24:29 -04:00
Alex Janousek
7e4947389c Merge pull request #2464 from GSA/dependabot/npm_and_yarn/sass-embedded-1.86.1
Bump sass-embedded from 1.86.0 to 1.86.1
2025-04-01 09:23:27 -04:00
dependabot[bot]
bf9537ccd4 Bump werkzeug from 3.0.6 to 3.1.3
Bumps [werkzeug](https://github.com/pallets/werkzeug) from 3.0.6 to 3.1.3.
- [Release notes](https://github.com/pallets/werkzeug/releases)
- [Changelog](https://github.com/pallets/werkzeug/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/werkzeug/compare/3.0.6...3.1.3)

---
updated-dependencies:
- dependency-name: werkzeug
  dependency-version: 3.1.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 10:40:45 +00:00
Alex Janousek
4225470b1e Merge pull request #2468 from GSA/dependabot/pip/isort-6.0.1
Bump isort from 5.13.2 to 6.0.1
2025-04-01 06:38:48 -04:00
Alex Janousek
c49d998f9e Merge pull request #2463 from GSA/dependabot/npm_and_yarn/rollup-4.38.0
Bump rollup from 4.37.0 to 4.38.0
2025-04-01 06:38:36 -04:00
dependabot[bot]
c9d9c7a3a6 Bump isort from 5.13.2 to 6.0.1
Bumps [isort](https://github.com/PyCQA/isort) from 5.13.2 to 6.0.1.
- [Release notes](https://github.com/PyCQA/isort/releases)
- [Changelog](https://github.com/PyCQA/isort/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PyCQA/isort/compare/5.13.2...6.0.1)

---
updated-dependencies:
- dependency-name: isort
  dependency-version: 6.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 00:29:05 +00:00
dependabot[bot]
35a2d940a0 Bump sass-embedded from 1.86.0 to 1.86.1
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.86.0 to 1.86.1.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.86.0...1.86.1)

---
updated-dependencies:
- dependency-name: sass-embedded
  dependency-version: 1.86.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 00:11:45 +00:00
dependabot[bot]
e1c6d41f78 Bump rollup from 4.37.0 to 4.38.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.37.0 to 4.38.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.37.0...v4.38.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 4.38.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-01 00:04:41 +00:00
Kenneth Kehl
e419d843a6 merge from main 2025-03-31 09:24:10 -07:00
Beverly Nguyen
c01a6a84f3 Merge pull request #2461 from GSA/update-backstop-screenshots
Update backstop files
2025-03-31 09:13:23 -07:00
Kenneth Kehl
7cd8be22f6 fix 2025-03-31 08:45:33 -07:00
alexjanousekGSA
f9dd331421 Update backstop files 2025-03-31 10:02:27 -04:00
Alex Janousek
78b30e3d76 Merge pull request #2458 from GSA/dependabot/pip/pre-commit-4.2.0
Bump pre-commit from 4.1.0 to 4.2.0
2025-03-31 09:45:06 -04:00
dependabot[bot]
bd4e1d751a Bump pre-commit from 4.1.0 to 4.2.0
Bumps [pre-commit](https://github.com/pre-commit/pre-commit) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/pre-commit/pre-commit/releases)
- [Changelog](https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md)
- [Commits](https://github.com/pre-commit/pre-commit/compare/v4.1.0...v4.2.0)

---
updated-dependencies:
- dependency-name: pre-commit
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-31 13:28:04 +00:00
Alex Janousek
f71b03a45c Merge pull request #2460 from GSA/dependabot/pip/notifications-python-client-10.0.1
Bump notifications-python-client from 10.0.0 to 10.0.1
2025-03-31 09:26:09 -04:00
dependabot[bot]
f1ccbe6f52 Bump notifications-python-client from 10.0.0 to 10.0.1
Bumps [notifications-python-client](https://github.com/alphagov/notifications-python-client) from 10.0.0 to 10.0.1.
- [Changelog](https://github.com/alphagov/notifications-python-client/blob/main/CHANGELOG.md)
- [Commits](https://github.com/alphagov/notifications-python-client/compare/10.0.0...10.0.1)

---
updated-dependencies:
- dependency-name: notifications-python-client
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-29 12:50:24 +00:00
Alex Janousek
bbe1e44366 Merge pull request #2457 from GSA/dependabot/npm_and_yarn/tar-fs-3.0.8
Bump tar-fs from 3.0.6 to 3.0.8
2025-03-29 08:48:34 -04:00
Alex Janousek
685deebae4 Merge pull request #2459 from GSA/dependabot/pip/click-8.1.8
Bump click from 8.1.7 to 8.1.8
2025-03-29 08:48:17 -04:00
dependabot[bot]
918016d4af Bump click from 8.1.7 to 8.1.8
Bumps [click](https://github.com/pallets/click) from 8.1.7 to 8.1.8.
- [Release notes](https://github.com/pallets/click/releases)
- [Changelog](https://github.com/pallets/click/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/click/compare/8.1.7...8.1.8)

---
updated-dependencies:
- dependency-name: click
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-29 12:24:29 +00:00
Alex Janousek
f87f0a1c9e Merge pull request #2454 from GSA/dependabot/pip/flake8-bugbear-24.12.12
Bump flake8-bugbear from 24.8.19 to 24.12.12
2025-03-29 08:22:37 -04:00
dependabot[bot]
869f76c846 Bump tar-fs from 3.0.6 to 3.0.8
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 3.0.6 to 3.0.8.
- [Commits](https://github.com/mafintosh/tar-fs/compare/v3.0.6...v3.0.8)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 22:19:50 +00:00
dependabot[bot]
3946e7bb3a Bump flake8-bugbear from 24.8.19 to 24.12.12
Bumps [flake8-bugbear](https://github.com/PyCQA/flake8-bugbear) from 24.8.19 to 24.12.12.
- [Release notes](https://github.com/PyCQA/flake8-bugbear/releases)
- [Commits](https://github.com/PyCQA/flake8-bugbear/compare/24.8.19...24.12.12)

---
updated-dependencies:
- dependency-name: flake8-bugbear
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 19:06:58 +00:00
Alex Janousek
56ee7ec376 Merge pull request #2453 from GSA/dependabot/pip/pyexcel-io-0.6.7
Bump pyexcel-io from 0.6.6 to 0.6.7
2025-03-28 15:04:58 -04:00
dependabot[bot]
5dad9e8f0f Bump pyexcel-io from 0.6.6 to 0.6.7
Bumps [pyexcel-io](https://github.com/pyexcel/pyexcel-io) from 0.6.6 to 0.6.7.
- [Release notes](https://github.com/pyexcel/pyexcel-io/releases)
- [Changelog](https://github.com/pyexcel/pyexcel-io/blob/dev/CHANGELOG.rst)
- [Commits](https://github.com/pyexcel/pyexcel-io/compare/v0.6.6...v0.6.7)

---
updated-dependencies:
- dependency-name: pyexcel-io
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 18:03:48 +00:00
Alex Janousek
23c5d7aff1 Merge pull request #2455 from GSA/dependabot/pip/humanize-4.12.2
Bump humanize from 4.11.0 to 4.12.2
2025-03-28 14:01:57 -04:00
dependabot[bot]
d2dd249b61 Bump humanize from 4.11.0 to 4.12.2
Bumps [humanize](https://github.com/python-humanize/humanize) from 4.11.0 to 4.12.2.
- [Release notes](https://github.com/python-humanize/humanize/releases)
- [Commits](https://github.com/python-humanize/humanize/compare/4.11.0...4.12.2)

---
updated-dependencies:
- dependency-name: humanize
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 17:08:41 +00:00
Alex Janousek
3e410ba5b2 Merge pull request #2456 from GSA/dependabot/pip/python-dotenv-1.1.0
Bump python-dotenv from 1.0.1 to 1.1.0
2025-03-28 13:06:49 -04:00
Jonathan Bobel
f55d47e3d1 Update column-errors.html 2025-03-28 11:00:13 -04:00
Jonathan Bobel
7813ce7914 Accessibility updates 2025-03-28 10:36:17 -04:00
ccostino
a1802a3439 Merge pull request #2451 from GSA/2450-missing-title-visibility
css update pill label to show visibility
2025-03-28 09:56:00 -04:00
dependabot[bot]
8897b30b81 Bump python-dotenv from 1.0.1 to 1.1.0
Bumps [python-dotenv](https://github.com/theskumar/python-dotenv) from 1.0.1 to 1.1.0.
- [Release notes](https://github.com/theskumar/python-dotenv/releases)
- [Changelog](https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/theskumar/python-dotenv/compare/v1.0.1...v1.1.0)

---
updated-dependencies:
- dependency-name: python-dotenv
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-28 00:00:36 +00:00
Kenneth Kehl
5741c572f0 some fixes 2025-03-27 14:47:43 -07:00
Beverly Nguyen
b0d8eda0f4 css update pill label 2025-03-27 14:41:45 -07:00
Beverly Nguyen
97b8f70c1f update js 2025-03-27 14:27:43 -07:00
Beverly Nguyen
e007571ac8 Merge pull request #2427 from GSA/1134-change-brackets-to-parenthesis
1134 - Changing all instances of the word "brackets" to "parenthesis"
2025-03-27 13:34:49 -07:00
Kenneth Kehl
9e5475cd43 fix import 2025-03-27 12:58:05 -07:00
Kenneth Kehl
6eaa471a5c more 2025-03-27 12:53:10 -07:00
Alex Janousek
6e72bc7f5e Merge pull request #2446 from GSA/dependabot/pip/regex-2024.11.6
Bump regex from 2024.9.11 to 2024.11.6
2025-03-27 13:04:26 -04:00
Beverly Nguyen
21980d2bdf flake8 and isort 2025-03-27 09:50:17 -07:00
dependabot[bot]
f4bc6d4531 Bump regex from 2024.9.11 to 2024.11.6
Bumps [regex](https://github.com/mrabarnett/mrab-regex) from 2024.9.11 to 2024.11.6.
- [Changelog](https://github.com/mrabarnett/mrab-regex/blob/hg/changelog.txt)
- [Commits](https://github.com/mrabarnett/mrab-regex/compare/2024.9.11...2024.11.6)

---
updated-dependencies:
- dependency-name: regex
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-27 16:48:27 +00:00
Alex Janousek
a5200220e2 Merge pull request #2445 from GSA/dependabot/pip/black-25.1.0
Bump black from 24.10.0 to 25.1.0
2025-03-27 12:46:28 -04:00
dependabot[bot]
8f45eeb2cf Bump black from 24.10.0 to 25.1.0
Bumps [black](https://github.com/psf/black) from 24.10.0 to 25.1.0.
- [Release notes](https://github.com/psf/black/releases)
- [Changelog](https://github.com/psf/black/blob/main/CHANGES.md)
- [Commits](https://github.com/psf/black/compare/24.10.0...25.1.0)

---
updated-dependencies:
- dependency-name: black
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-27 14:01:27 +00:00
Alex Janousek
b134a68845 Merge pull request #2444 from GSA/dependabot/pip/flake8-pytest-style-2.1.0
Bump flake8-pytest-style from 2.0.0 to 2.1.0
2025-03-27 09:59:44 -04:00
Alex Janousek
4b910bec88 Merge pull request #2443 from GSA/dependabot/pip/moto-5.1.1
Bump moto from 5.0.22 to 5.1.1
2025-03-27 09:59:32 -04:00
Jonathan Bobel
96890199f3 Style update 2025-03-27 09:19:09 -04:00
dependabot[bot]
238a281512 Bump flake8-pytest-style from 2.0.0 to 2.1.0
Bumps [flake8-pytest-style](https://github.com/m-burst/flake8-pytest-style) from 2.0.0 to 2.1.0.
- [Commits](https://github.com/m-burst/flake8-pytest-style/compare/v2.0.0...v2.1.0)

---
updated-dependencies:
- dependency-name: flake8-pytest-style
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 23:50:21 +00:00
dependabot[bot]
cafd7d75b7 Bump moto from 5.0.22 to 5.1.1
Bumps [moto](https://github.com/getmoto/moto) from 5.0.22 to 5.1.1.
- [Release notes](https://github.com/getmoto/moto/releases)
- [Changelog](https://github.com/getmoto/moto/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getmoto/moto/compare/5.0.22...5.1.1)

---
updated-dependencies:
- dependency-name: moto
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 23:50:01 +00:00
Beverly Nguyen
f246cc7c51 cleaned up init 2025-03-26 14:54:26 -07:00
Kenneth Kehl
d92e2a7c04 more 2025-03-26 14:21:45 -07:00
Kenneth Kehl
94b791c869 more 2025-03-26 13:34:23 -07:00
Jonathan Bobel
700c76807b Update send.html 2025-03-26 16:01:56 -04:00
Beverly Nguyen
e0e8c56a61 install socket io and getting an example up 2025-03-26 12:54:21 -07:00
Jonathan Bobel
d79ece2d01 2138 - Change cancel button to uploading button for CSV 2025-03-26 14:49:11 -04:00
Kenneth Kehl
0108bcf91f upgrade mistune to 3.1.3 2025-03-26 09:16:07 -07:00
Alex Janousek
7458acdab1 Merge pull request #2437 from GSA/dependabot/pip/charset-normalizer-3.4.1
Bump charset-normalizer from 3.4.0 to 3.4.1
2025-03-26 11:00:43 -04:00
dependabot[bot]
c7e3d777ac Bump charset-normalizer from 3.4.0 to 3.4.1
Bumps [charset-normalizer](https://github.com/jawah/charset_normalizer) from 3.4.0 to 3.4.1.
- [Release notes](https://github.com/jawah/charset_normalizer/releases)
- [Changelog](https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jawah/charset_normalizer/compare/3.4.0...3.4.1)

---
updated-dependencies:
- dependency-name: charset-normalizer
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 14:45:59 +00:00
Alex Janousek
ec45db1ea4 Merge pull request #2438 from GSA/dependabot/pip/boto3-1.35.99
Bump boto3 from 1.35.51 to 1.35.99
2025-03-26 10:44:10 -04:00
dependabot[bot]
9bed7d4253 Bump boto3 from 1.35.51 to 1.35.99
Bumps [boto3](https://github.com/boto/boto3) from 1.35.51 to 1.35.99.
- [Release notes](https://github.com/boto/boto3/releases)
- [Commits](https://github.com/boto/boto3/compare/1.35.51...1.35.99)

---
updated-dependencies:
- dependency-name: boto3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 14:19:42 +00:00
Alex Janousek
8c56a75af7 Merge pull request #2439 from GSA/dependabot/pip/beautifulsoup4-4.13.3
Bump beautifulsoup4 from 4.12.3 to 4.13.3
2025-03-26 10:17:45 -04:00
dependabot[bot]
d9eebb4f64 Bump beautifulsoup4 from 4.12.3 to 4.13.3
Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.12.3 to 4.13.3.

---
updated-dependencies:
- dependency-name: beautifulsoup4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 13:54:18 +00:00
Alex Janousek
6546acf434 Merge pull request #2433 from GSA/dependabot/pip/pyexcel-xls-0.7.1
Bump pyexcel-xls from 0.7.0 to 0.7.1
2025-03-26 09:52:21 -04:00
Jonathan Bobel
bd77775286 Merge pull request #2411 from GSA/2410-bug-radio-buttons-cannot-be-selected
revert change back to params.for in order for user to select radio op…
2025-03-25 15:04:01 -04:00
dependabot[bot]
132ced0042 Bump pyexcel-xls from 0.7.0 to 0.7.1
Bumps [pyexcel-xls](https://github.com/pyexcel/pyexcel-xls) from 0.7.0 to 0.7.1.
- [Release notes](https://github.com/pyexcel/pyexcel-xls/releases)
- [Changelog](https://github.com/pyexcel/pyexcel-xls/blob/dev/CHANGELOG.rst)
- [Commits](https://github.com/pyexcel/pyexcel-xls/compare/v0.7.0...v0.7.1)

---
updated-dependencies:
- dependency-name: pyexcel-xls
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 18:52:49 +00:00
Alex Janousek
7922004f9a Merge pull request #2434 from GSA/dependabot/pip/cachetools-5.5.2
Bump cachetools from 5.5.0 to 5.5.2
2025-03-25 14:50:50 -04:00
dependabot[bot]
3a38ea2db6 Bump cachetools from 5.5.0 to 5.5.2
Bumps [cachetools](https://github.com/tkem/cachetools) from 5.5.0 to 5.5.2.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v5.5.0...v5.5.2)

---
updated-dependencies:
- dependency-name: cachetools
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 16:03:48 +00:00
Alex Janousek
3af8f782ec Merge pull request #2435 from GSA/dependabot/pip/pyexcel-0.7.2
Bump pyexcel from 0.7.0 to 0.7.2
2025-03-25 12:01:54 -04:00
dependabot[bot]
cbb1288345 Bump pyexcel from 0.7.0 to 0.7.2
Bumps [pyexcel](https://github.com/pyexcel/pyexcel) from 0.7.0 to 0.7.2.
- [Release notes](https://github.com/pyexcel/pyexcel/releases)
- [Changelog](https://github.com/pyexcel/pyexcel/blob/dev/CHANGELOG.rst)
- [Commits](https://github.com/pyexcel/pyexcel/compare/v0.7.0...v0.7.2)

---
updated-dependencies:
- dependency-name: pyexcel
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 13:51:05 +00:00
Alex Janousek
96c033cd6f Merge pull request #2432 from GSA/dependabot/pip/certifi-2025.1.31
Bump certifi from 2024.8.30 to 2025.1.31
2025-03-25 09:49:09 -04:00
Alex Janousek
5d43ec2bb6 Merge pull request #2431 from GSA/dependabot/npm_and_yarn/rollup-4.37.0
Bump rollup from 4.36.0 to 4.37.0
2025-03-25 09:48:58 -04:00
dependabot[bot]
fff5caee1f Bump certifi from 2024.8.30 to 2025.1.31
Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.8.30 to 2025.1.31.
- [Commits](https://github.com/certifi/python-certifi/compare/2024.08.30...2025.01.31)

---
updated-dependencies:
- dependency-name: certifi
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 01:14:54 +00:00
dependabot[bot]
6cfb15106e Bump rollup from 4.36.0 to 4.37.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.36.0 to 4.37.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.36.0...v4.37.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 00:56:17 +00:00
Beverly Nguyen
5507891d8f Merge branch 'main' into 2410-bug-radio-buttons-cannot-be-selected 2025-03-24 12:49:04 -07:00
Beverly Nguyen
1a5f255539 jest fix 2025-03-24 12:48:28 -07:00
Beverly Nguyen
7e2a2bad8e update validation code 2025-03-24 12:33:01 -07:00
Alex Janousek
5c7a8913b0 Merge pull request #2316 from GSA/dependabot/pip/pytest-playwright-0.7.0
Bump pytest-playwright from 0.5.2 to 0.7.0
2025-03-24 12:28:40 -04:00
alexjanousekGSA
52a11945a1 Merge branch 'main' into dependabot/pip/pytest-playwright-0.7.0 2025-03-24 12:18:44 -04:00
Alex Janousek
79ea3a3ac9 Merge pull request #2429 from GSA/dependabot/pip/coverage-7.7.1
Bump coverage from 7.6.4 to 7.7.1
2025-03-24 12:16:31 -04:00
dependabot[bot]
88ff982c0d Bump coverage from 7.6.4 to 7.7.1
Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.6.4 to 7.7.1.
- [Release notes](https://github.com/nedbat/coveragepy/releases)
- [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst)
- [Commits](https://github.com/nedbat/coveragepy/compare/7.6.4...7.7.1)

---
updated-dependencies:
- dependency-name: coverage
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-24 13:28:07 +00:00
ccostino
77c97eeb0b Merge pull request #2423 from GSA/dependabot/pip/numpy-2.2.4
Bump numpy from 2.2.3 to 2.2.4
2025-03-24 09:22:00 -04:00
dependabot[bot]
5d4394bfda Bump numpy from 2.2.3 to 2.2.4
Bumps [numpy](https://github.com/numpy/numpy) from 2.2.3 to 2.2.4.
- [Release notes](https://github.com/numpy/numpy/releases)
- [Changelog](https://github.com/numpy/numpy/blob/main/doc/RELEASE_WALKTHROUGH.rst)
- [Commits](https://github.com/numpy/numpy/compare/v2.2.3...v2.2.4)

---
updated-dependencies:
- dependency-name: numpy
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-22 14:29:50 +00:00
Alex Janousek
7485162411 Merge pull request #2430 from GSA/dependabot/pip/gunicorn-23.0.0
Bump gunicorn from 22.0.0 to 23.0.0
2025-03-22 10:27:58 -04:00
dependabot[bot]
d16c0c5153 Bump gunicorn from 22.0.0 to 23.0.0
Bumps [gunicorn](https://github.com/benoitc/gunicorn) from 22.0.0 to 23.0.0.
- [Release notes](https://github.com/benoitc/gunicorn/releases)
- [Commits](https://github.com/benoitc/gunicorn/compare/22.0.0...23.0.0)

---
updated-dependencies:
- dependency-name: gunicorn
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-22 14:07:53 +00:00
Alex Janousek
5144b90f22 Merge branch 'main' into dependabot/pip/pytest-playwright-0.7.0 2025-03-22 10:06:47 -04:00
Alex Janousek
418a868e18 Merge pull request #2422 from GSA/dependabot/pip/redis-5.2.1
Bump redis from 5.2.0 to 5.2.1
2025-03-22 10:05:57 -04:00
Beverly Nguyen
3a38b8bf31 fixed validation for radio and text input fields 2025-03-21 18:53:49 -07:00
Beverly Nguyen
04f4f2e990 Merge pull request #2428 from GSA/remove-about-feature-flag 2025-03-20 16:14:16 -07:00
alexjanousekGSA
9efe503353 Fixed linting issue 2025-03-20 14:32:44 -04:00
Jonathan Bobel
012dc4fae6 Merge pull request #2425 from GSA/2255-CSV-content-update
2255 - Content update for CSV upload area
2025-03-20 14:29:19 -04:00
alexjanousekGSA
35f3203e9c Removed feature flag 2025-03-20 14:22:41 -04:00
ccostino
cb4cfeb610 Merge pull request #2409 from GSA/2400-styling-on-the-template-page-is-off
fix styling issue
2025-03-20 13:37:18 -04:00
Jonathan Bobel
15103c99b5 Merge pull request #2403 from GSA/2298-bug-able-to-keep-pressing-send-and-send-more-and-more-while-processing
Prevent duplicate form submissions
2025-03-20 13:06:51 -04:00
Jonathan Bobel
6dd8b3cfe0 Update validators.py 2025-03-20 10:45:33 -04:00
Jonathan Bobel
fe098eca22 1134 - Changing all instances of the word "brackets" to "parenthesis" 2025-03-20 10:29:29 -04:00
Jonathan Bobel
0ca31c1ed1 Update send.html
Removed role attribute
2025-03-20 10:21:03 -04:00
Beverly Nguyen
78ee70b0c1 Merge branch 'main' into 2410-bug-radio-buttons-cannot-be-selected 2025-03-19 14:04:56 -07:00
Beverly Nguyen
71b7c745db Merge branch 'main' into 2400-styling-on-the-template-page-is-off 2025-03-19 14:02:57 -07:00
Beverly Nguyen
da194d358c removing comments 2025-03-19 13:13:29 -07:00
dependabot[bot]
a539fcbef6 Bump redis from 5.2.0 to 5.2.1
Bumps [redis](https://github.com/redis/redis-py) from 5.2.0 to 5.2.1.
- [Release notes](https://github.com/redis/redis-py/releases)
- [Changelog](https://github.com/redis/redis-py/blob/master/CHANGES)
- [Commits](https://github.com/redis/redis-py/compare/v5.2.0...v5.2.1)

---
updated-dependencies:
- dependency-name: redis
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-19 20:07:25 +00:00
Beverly Nguyen
a5ddf8038b Merge pull request #2412 from GSA/2042-no-emojis-special-characters-plain-language
2042 no emojis special characters plain language
2025-03-19 13:05:32 -07:00
Jonathan Bobel
06d0581bc9 Update send.html 2025-03-19 15:54:55 -04:00
Jonathan Bobel
937aa5af15 Update templates.py 2025-03-19 14:35:22 -04:00
Jonathan Bobel
b5203f473a Adding the personalization message back in 2025-03-19 11:30:01 -04:00
ccostino
dc03a3f0d1 Merge pull request #2418 from GSA/feat/text-by-user-update
Updated FE to allow stats by user
2025-03-19 11:13:14 -04:00
Jonathan Bobel
7afdf7336a Update test_templates.py 2025-03-19 10:26:49 -04:00
Carlo Costino
606b124912 Fix existing end-to-end tests
This changeset re-enables our existing end-to-end tests and gets them working again after responding to a security incident.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-03-18 23:24:49 -04:00
Jonathan Bobel
bab13de934 Update test_validators.py
Fixing a test
2025-03-18 16:42:15 -04:00
Jonathan Bobel
c05beb42f2 Update templates.py 2025-03-18 16:28:30 -04:00
Jonathan Bobel
2049fd5c76 Fixing formatting errors 2025-03-18 16:07:58 -04:00
Jonathan Bobel
1d911c4d44 Updates to text area validation on template edit page 2025-03-18 15:55:01 -04:00
Jonathan Bobel
bc83fab764 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2042-no-emojis-special-characters-plain-language 2025-03-18 15:52:40 -04:00
Andrew Shumway
051114157d Merge pull request #2395 from GSA/dependabot/pip/newrelic-10.7.0
Bump newrelic from 10.6.0 to 10.7.0
2025-03-18 12:40:45 -06:00
Andrew Shumway
cac7d1452a Merge pull request #2396 from GSA/dependabot/pip/cryptography-44.0.2
Bump cryptography from 44.0.1 to 44.0.2
2025-03-18 12:35:37 -06:00
ecayer
f9ea913b00 Merge pull request #2419 from GSA/update_cert
add comment to force redeploy
2025-03-18 10:28:33 -07:00
Kenneth Kehl
9a8a80ab14 add comment 2025-03-18 10:19:02 -07:00
dependabot[bot]
707768d749 Bump newrelic from 10.6.0 to 10.7.0
Bumps [newrelic](https://github.com/newrelic/newrelic-python-agent) from 10.6.0 to 10.7.0.
- [Release notes](https://github.com/newrelic/newrelic-python-agent/releases)
- [Commits](https://github.com/newrelic/newrelic-python-agent/compare/v10.6.0...v10.7.0)

---
updated-dependencies:
- dependency-name: newrelic
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-18 16:54:44 +00:00
dependabot[bot]
d05bf1e9e0 Bump cryptography from 44.0.1 to 44.0.2
Bumps [cryptography](https://github.com/pyca/cryptography) from 44.0.1 to 44.0.2.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/44.0.1...44.0.2)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-18 16:54:41 +00:00
Andrew Shumway
da081679c1 Merge pull request #2394 from GSA/dependabot/pip/flake8-7.1.2
Bump flake8 from 7.1.1 to 7.1.2
2025-03-18 10:52:49 -06:00
alexjanousekGSA
61c37687a2 Merge branch 'main' into feat/text-by-user-update 2025-03-18 11:21:25 -04:00
Alex Janousek
8bc6df5d35 Merge pull request #2392 from GSA/dependabot/npm_and_yarn/babel/core-7.26.10
Bump @babel/core from 7.26.9 to 7.26.10
2025-03-18 11:14:50 -04:00
Alex Janousek
e84e3efed3 Merge pull request #2393 from GSA/dependabot/npm_and_yarn/rollup/plugin-node-resolve-16.0.1
Bump @rollup/plugin-node-resolve from 16.0.0 to 16.0.1
2025-03-18 11:14:35 -04:00
Alex Janousek
fdceb3cbdb Merge pull request #2414 from GSA/dependabot/npm_and_yarn/rollup-4.36.0
Bump rollup from 4.35.0 to 4.36.0
2025-03-18 11:14:05 -04:00
Alex Janousek
26c695c21e Merge pull request #2415 from GSA/dependabot/npm_and_yarn/playwright-1.51.1
Bump playwright from 1.51.0 to 1.51.1
2025-03-18 11:13:52 -04:00
Alex Janousek
b4907fd2fb Merge pull request #2416 from GSA/dependabot/npm_and_yarn/sass-embedded-1.86.0
Bump sass-embedded from 1.85.1 to 1.86.0
2025-03-18 11:13:40 -04:00
alexjanousekGSA
f13ab20e93 Updated FE to allow stats by user 2025-03-18 11:09:09 -04:00
dependabot[bot]
9404a09dfa Bump sass-embedded from 1.85.1 to 1.86.0
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.85.1 to 1.86.0.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.85.1...1.86.0)

---
updated-dependencies:
- dependency-name: sass-embedded
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-18 00:08:10 +00:00
dependabot[bot]
fda16b7ce9 Bump playwright from 1.51.0 to 1.51.1
Bumps [playwright](https://github.com/microsoft/playwright) from 1.51.0 to 1.51.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.51.0...v1.51.1)

---
updated-dependencies:
- dependency-name: playwright
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-18 00:06:13 +00:00
dependabot[bot]
3ae05a37c9 Bump rollup from 4.35.0 to 4.36.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.35.0 to 4.36.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.35.0...v4.36.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-18 00:05:26 +00:00
ccostino
0df8b37646 Merge pull request #2413 from GSA/ugh_fix
ugh
2025-03-17 19:38:05 -04:00
Kenneth Kehl
cb334c0dcd ugh 2025-03-17 16:28:46 -07:00
Beverly Nguyen
1cd51a8257 remove comment 2025-03-17 16:04:09 -07:00
Beverly Nguyen
3b8fdd8122 remove comment 2025-03-17 15:46:25 -07:00
Jonathan Bobel
43c0d6244a Addressing a test 2025-03-17 16:49:30 -04:00
Jonathan Bobel
fbf0fb1f0d 2042 - Updates to the error message regarding special characters 2025-03-17 16:47:45 -04:00
Beverly Nguyen
965db9cd7e revert change back to params.for in order for user to select radio option 2025-03-17 13:45:19 -07:00
Beverly Nguyen
3555db1163 fix styling issue 2025-03-17 12:12:06 -07:00
ccostino
f820ae86f3 Merge pull request #2408 from GSA/ugh_fix
initial
2025-03-17 15:07:52 -04:00
Kenneth Kehl
47657d45ed initial 2025-03-17 09:57:15 -07:00
Beverly Nguyen
fab1ef6d45 jest 2025-03-14 13:56:48 -07:00
Beverly Nguyen
10fb9f9b35 jest 2025-03-14 13:54:20 -07:00
Beverly Nguyen
02a188a080 fixed e2e 2025-03-14 13:47:02 -07:00
Beverly Nguyen
9facde2c60 Merge pull request #2397 from GSA/2391-youtube-video-not-playing
2391 - Updating Cross Origin code to allow Youtube
2025-03-14 12:53:59 -07:00
ccostino
592ea83ea2 Merge pull request #2406 from GSA/content-updates
update banner color
2025-03-14 14:21:53 -04:00
Beverly Nguyen
dd0d5d3b33 update banner color 2025-03-14 11:11:42 -07:00
Beverly Nguyen
29373d41ca Merge branch 'main' into 2298-bug-able-to-keep-pressing-send-and-send-more-and-more-while-processing 2025-03-14 11:05:32 -07:00
Beverly Nguyen
55225018b6 remove comments 2025-03-14 09:28:59 -07:00
Jonathan Bobel
5a1b656d7e Update notifications_utils/request_helper.py
Co-authored-by: ccostino <ccostino@users.noreply.github.com>
2025-03-14 12:13:52 -04:00
ccostino
46e43b6fbd Merge pull request #2399 from GSA/2398-broken-tts-link
2398 - broken TTS link
2025-03-14 11:40:51 -04:00
ccostino
542ce8ec00 Merge pull request #2404 from GSA/content-updates
content updates
2025-03-14 10:56:44 -04:00
Beverly Nguyen
371fbb2cd4 fixed test and e2e 2025-03-13 21:49:40 -07:00
Beverly Nguyen
41dcedd48f update to nav 2025-03-13 15:54:14 -07:00
Beverly Nguyen
d64d84ff4a flake8 2025-03-13 15:51:24 -07:00
Beverly Nguyen
558753037f content updates 2025-03-13 15:43:21 -07:00
Beverly Nguyen
821265cf6e preventing users from double click on submit 2025-03-13 15:04:12 -07:00
Jonathan Bobel
236fafd597 Update request_helper.py 2025-03-13 14:26:45 -04:00
Jonathan Bobel
22d643acb1 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2391-youtube-video-not-playing 2025-03-13 14:24:13 -04:00
Jonathan Bobel
9e8aec4c5d 2398 - broken TTS link
Updating TTS link, maybe the link used to go to a page that was removed
2025-03-12 15:37:51 -04:00
Jonathan Bobel
21408543d4 Update request_helper.py
Adjusting cross-origin checks to allow Youtube
2025-03-12 12:52:32 -04:00
dependabot[bot]
aff028b24c Bump flake8 from 7.1.1 to 7.1.2
Bumps [flake8](https://github.com/pycqa/flake8) from 7.1.1 to 7.1.2.
- [Commits](https://github.com/pycqa/flake8/compare/7.1.1...7.1.2)

---
updated-dependencies:
- dependency-name: flake8
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-12 00:02:15 +00:00
dependabot[bot]
a652c5f321 Bump @rollup/plugin-node-resolve from 16.0.0 to 16.0.1
Bumps [@rollup/plugin-node-resolve](https://github.com/rollup/plugins/tree/HEAD/packages/node-resolve) from 16.0.0 to 16.0.1.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/node-resolve/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/node-resolve-v16.0.1/packages/node-resolve)

---
updated-dependencies:
- dependency-name: "@rollup/plugin-node-resolve"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-11 23:18:00 +00:00
dependabot[bot]
06814cd0a5 Bump @babel/core from 7.26.9 to 7.26.10
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.26.9 to 7.26.10.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-core)

---
updated-dependencies:
- dependency-name: "@babel/core"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-11 23:17:51 +00:00
dependabot[bot]
adf37eb4d0 Bump pytest-playwright from 0.5.2 to 0.7.0
Bumps [pytest-playwright](https://github.com/microsoft/playwright-pytest) from 0.5.2 to 0.7.0.
- [Release notes](https://github.com/microsoft/playwright-pytest/releases)
- [Commits](https://github.com/microsoft/playwright-pytest/compare/v0.5.2...v0.7.0)

---
updated-dependencies:
- dependency-name: pytest-playwright
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-10 14:32:40 +00:00
211 changed files with 6385 additions and 4433 deletions

View File

@@ -127,6 +127,16 @@
}
],
"results": {
".github/actions/deploy-proxy/action.yml": [
{
"type": "Hex High Entropy String",
"filename": ".github/actions/deploy-proxy/action.yml",
"hashed_secret": "a6c13f5da3788e8d654cd24001dc79a238723248",
"is_verified": false,
"line_number": 18,
"is_secret": false
}
],
".github/workflows/checks.yml": [
{
"type": "Secret Keyword",
@@ -161,7 +171,7 @@
"filename": "app/config.py",
"hashed_secret": "577a4c667e4af8682ca431857214b3a920883efc",
"is_verified": false,
"line_number": 120,
"line_number": 123,
"is_secret": false
}
],
@@ -399,26 +409,6 @@
"is_secret": false
}
],
"app/templates/new/components/head.html": [
{
"type": "Base64 High Entropy String",
"filename": "app/templates/new/components/head.html",
"hashed_secret": "ee5048791fc7ff45a1545e24f85bec3317371327",
"is_verified": false,
"line_number": 33,
"is_secret": false
}
],
"app/templates/old/admin_template.html": [
{
"type": "Base64 High Entropy String",
"filename": "app/templates/old/admin_template.html",
"hashed_secret": "ee5048791fc7ff45a1545e24f85bec3317371327",
"is_verified": false,
"line_number": 18,
"is_secret": false
}
],
"deploy-config/sandbox.yml": [
{
"type": "Secret Keyword",
@@ -652,37 +642,7 @@
"line_number": 3266,
"is_secret": false
}
],
"tests/notifications_utils/clients/antivirus/test_antivirus_client.py": [
{
"type": "Secret Keyword",
"filename": "tests/notifications_utils/clients/antivirus/test_antivirus_client.py",
"hashed_secret": "932b25270abe1301c22c709a19082dff07d469ff",
"is_verified": false,
"line_number": 16,
"is_secret": false
}
],
"tests/notifications_utils/clients/encryption/test_encryption_client.py": [
{
"type": "Secret Keyword",
"filename": "tests/notifications_utils/clients/encryption/test_encryption_client.py",
"hashed_secret": "f1e923a9667de11be6a210849a8651c1bfd81605",
"is_verified": false,
"line_number": 13,
"is_secret": false
}
],
"tests/notifications_utils/clients/zendesk/test_zendesk_client.py": [
{
"type": "Secret Keyword",
"filename": "tests/notifications_utils/clients/zendesk/test_zendesk_client.py",
"hashed_secret": "913a73b565c8e2c8ed94497580f619397709b8b6",
"is_verified": false,
"line_number": 16,
"is_secret": false
}
]
},
"generated_at": "2025-02-26T18:19:37Z"
"generated_at": "2025-05-22T19:03:11Z"
}

View File

@@ -9,10 +9,9 @@ body:
label: Log In
options:
- label: notify-staging.app.cloud.gov resolves
- label: Clicking sign in takes you to login page
- label: 2FA code is sent promptly
- label: 2FA code input screen appears as expected
- label: After code is entered, you are brought to the “choose service” screen
- label: Clicking sign in takes you to Login.gov
- label: Can sign in via Login.gov
- label: After successful login, you are brought to the “choose service” screen
- label: Choosing a service brings you to the dashboard for that service
- type: checkboxes
@@ -72,11 +71,10 @@ body:
- label: From team member screen, clicking “Change Details” on a specific profile brings you to that persons profile
- label: Clicking on “Remove this team member” prompts a confirmation
- label: Clicking the confirmation removes the team member
- type: checkboxes
id: sign_out
attributes:
label: Sign Out
options:
- label: Hitting “Sign Out” takes you back to the homepage and logs you out
- label: Clicking “Sign Out” takes you back to the homepage and logs you out

View File

@@ -15,7 +15,7 @@ inputs:
default: https://github.com/GSA-TTS/cg-egress-proxy.git
proxy_version:
description: git ref to be deployed
default: main
default: 1500c67157c1a7a6fbbda7a2de172b3d0a67e703
runs:
using: composite
steps:

View File

@@ -15,7 +15,13 @@ runs:
python-version: "3.12.3"
- name: Install poetry
shell: bash
run: pip install poetry==1.8.5
run: pip install poetry==2.1.3
- name: Install poetry export plugin
shell: bash
run: poetry self add poetry-plugin-export
- name: Downgrade virtualenv to compatible version
shell: bash
run: pip install "virtualenv<20.30"
- name: Install application dependencies
shell: bash
run: make bootstrap

View File

@@ -10,9 +10,9 @@ updates:
schedule:
interval: "daily"
assignees:
- "A-Shumway42"
- "alexjanousekGSA"
reviewers:
- "A-Shumway42"
- "alexjanousekGSA"
- package-ecosystem: "npm"
directory: "/"
schedule:

View File

@@ -118,6 +118,7 @@ jobs:
NOTIFY_E2E_TEST_PASSWORD: ${{ secrets.NOTIFY_E2E_TEST_PASSWORD }}
NOTIFY_E2E_TEST_URI: http://localhost:6012/
VCAP_SERVICES: ${{ secrets.VCAP_SERVICES }}
validate-new-relic-config:
runs-on: ubuntu-latest
environment: staging
@@ -138,13 +139,12 @@ jobs:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-project
- name: Create requirements.txt
run: poetry export --without-hashes --format=requirements.txt > requirements.txt
run: poetry export --output requirements.txt
- uses: pypa/gh-action-pip-audit@v1.1.0
with:
inputs: requirements.txt
ignore-vulns: |
PYSEC-2024-60
PYSEC-2022-43162
PYSEC-2023-312
- name: Run npm audit
run: make npm-audit
@@ -165,7 +165,7 @@ jobs:
run: make run-flask &
env:
NOTIFY_ENVIRONMENT: scanning
FEATURE_ABOUT_PAGE_ENABLED: true
FEATURE_SOCKET_ENABLED: true
- name: Run OWASP Baseline Scan
uses: zaproxy/action-baseline@v0.14.0
with:

View File

@@ -25,10 +25,12 @@ jobs:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-project
- name: Create requirements.txt
run: poetry export --without-hashes --format=requirements.txt > requirements.txt
run: poetry export --output requirements.txt
- uses: pypa/gh-action-pip-audit@v1.1.0
with:
inputs: requirements.txt
ignore-vulns: |
PYSEC-2023-312
- name: Run npm audit
run: make npm-audit

View File

@@ -24,23 +24,13 @@ jobs:
terraform_version: "^1.7.5"
terraform_wrapper: false
- name: Check for changes to Terraform
id: changed-terraform-files
uses: tj-actions/changed-files@v45
with:
files: |
terraform/demo/**
terraform/shared/**
.github/workflows/deploy-demo.yml
- name: Terraform init
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/demo
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
run: terraform init
- name: Terraform apply
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/demo
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
@@ -52,7 +42,7 @@ jobs:
- uses: ./.github/actions/setup-project
- name: Create requirements.txt
run: poetry export --without-hashes --format=requirements.txt > requirements.txt
run: poetry export --output requirements.txt
- name: Deploy to cloud.gov
uses: cloud-gov/cg-cli-tools@main
@@ -73,6 +63,8 @@ jobs:
LOGIN_DOT_GOV_SIGNOUT_REDIRECT: "https://notify-demo.app.cloud.gov/sign-out"
LOGIN_DOT_GOV_INITIAL_SIGNIN_URL: "https://secure.login.gov/openid_connect/authorize?acr_values=http%3A%2F%2Fidmanagement.gov%2Fns%2Fassurance%2Fial%2F1&client_id=urn:gov:gsa:openidconnect.profiles:sp:sso:gsa:notify-gov&nonce=NONCE&prompt=select_account&redirect_uri=https://notify-demo.app.cloud.gov/sign-in&response_type=code&scope=openid+email&state=STATE"
LOGIN_DOT_GOV_CERTS_URL: "https://secure.login.gov/api/openid_connect/certs"
API_PUBLIC_URL: ${{ secrets.API_PUBLIC_URL }}
API_PUBLIC_WS_URL: ${{ secrets.API_PUBLIC_WS_URL }}
with:
cf_username: ${{ secrets.CLOUDGOV_USERNAME }}
cf_password: ${{ secrets.CLOUDGOV_PASSWORD }}
@@ -97,18 +89,11 @@ jobs:
--var LOGIN_DOT_GOV_INITIAL_SIGNIN_URL="$LOGIN_DOT_GOV_INITIAL_SIGNIN_URL"
--var LOGIN_DOT_GOV_CERTS_URL="$LOGIN_DOT_GOV_CERTS_URL"
--var LOGIN_PEM="$LOGIN_PEM"
--var API_PUBLIC_URL="$API_PUBLIC_URL"
--var API_PUBLIC_WS_URL="$API_PUBLIC_WS_URL"
--strategy rolling
- name: Check for changes to egress config
id: changed-egress-config
uses: tj-actions/changed-files@v45
with:
files: |
deploy-config/egress_proxy/notify-admin-demo.*.acl
.github/actions/deploy-proxy/action.yml
.github/workflows/deploy-demo.yml
- name: Deploy egress proxy
if: steps.changed-egress-config.outputs.any_changed == 'true'
uses: ./.github/actions/deploy-proxy
env:
CF_USERNAME: ${{ secrets.CLOUDGOV_USERNAME }}

View File

@@ -24,23 +24,13 @@ jobs:
terraform_version: "^1.7.5"
terraform_wrapper: false
- name: Check for changes to Terraform
id: changed-terraform-files
uses: tj-actions/changed-files@v45
with:
files: |
terraform/production/**
terraform/shared/**
.github/workflows/deploy-prod.yml
- name: Terraform init
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/production
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
run: terraform init
- name: Terraform apply
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/production
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
@@ -52,7 +42,7 @@ jobs:
- uses: ./.github/actions/setup-project
- name: Create requirements.txt
run: poetry export --without-hashes --format=requirements.txt > requirements.txt
run: poetry export --output requirements.txt
- name: Deploy to cloud.gov
uses: cloud-gov/cg-cli-tools@main
@@ -73,6 +63,8 @@ jobs:
LOGIN_DOT_GOV_SIGNOUT_REDIRECT: "https://beta.notify.gov/sign-out"
LOGIN_DOT_GOV_INITIAL_SIGNIN_URL: "https://secure.login.gov/openid_connect/authorize?acr_values=http%3A%2F%2Fidmanagement.gov%2Fns%2Fassurance%2Fial%2F1&client_id=urn:gov:gsa:openidconnect.profiles:sp:sso:gsa:notify-gov&nonce=NONCE&prompt=select_account&redirect_uri=https://beta.notify.gov/sign-in&response_type=code&scope=openid+email&state=STATE"
LOGIN_DOT_GOV_CERTS_URL: "https://secure.login.gov/api/openid_connect/certs"
API_PUBLIC_URL: ${{ secrets.API_PUBLIC_URL }}
API_PUBLIC_WS_URL: ${{ secrets.API_PUBLIC_WS_URL }}
with:
cf_username: ${{ secrets.CLOUDGOV_USERNAME }}
cf_password: ${{ secrets.CLOUDGOV_PASSWORD }}
@@ -97,18 +89,11 @@ jobs:
--var LOGIN_DOT_GOV_INITIAL_SIGNIN_URL="$LOGIN_DOT_GOV_INITIAL_SIGNIN_URL"
--var LOGIN_DOT_GOV_CERTS_URL="$LOGIN_DOT_GOV_CERTS_URL"
--var LOGIN_PEM="$LOGIN_PEM"
--var API_PUBLIC_URL="$API_PUBLIC_URL"
--var API_PUBLIC_WS_URL="$API_PUBLIC_WS_URL"
--strategy rolling
- name: Check for changes to egress config
id: changed-egress-config
uses: tj-actions/changed-files@v45
with:
files: |
deploy-config/egress_proxy/notify-admin-production.*.acl
.github/actions/deploy-proxy/action.yml
.github/workflows/deploy-prod.yml
- name: Deploy egress proxy
if: steps.changed-egress-config.outputs.any_changed == 'true'
uses: ./.github/actions/deploy-proxy
env:
CF_USERNAME: ${{ secrets.CLOUDGOV_USERNAME }}

View File

@@ -29,23 +29,13 @@ jobs:
terraform_version: "^1.7.5"
terraform_wrapper: false
- name: Check for changes to Terraform
id: changed-terraform-files
uses: tj-actions/changed-files@v45
with:
files: |
terraform/staging/**
terraform/shared/**
.github/workflows/deploy.yml
- name: Terraform init
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/staging
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
run: terraform init
- name: Terraform apply
if: steps.changed-terraform-files.outputs.any_changed == 'true'
working-directory: terraform/staging
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
@@ -57,7 +47,7 @@ jobs:
- uses: ./.github/actions/setup-project
- name: Create requirements.txt
run: poetry export --without-hashes --format=requirements.txt > requirements.txt
run: poetry export --output requirements.txt
- name: Deploy to cloud.gov
@@ -79,6 +69,8 @@ jobs:
LOGIN_DOT_GOV_SIGNOUT_REDIRECT: "https://notify-staging.app.cloud.gov/sign-out"
LOGIN_DOT_GOV_INITIAL_SIGNIN_URL: "https://secure.login.gov/openid_connect/authorize?acr_values=http%3A%2F%2Fidmanagement.gov%2Fns%2Fassurance%2Fial%2F1&client_id=urn:gov:gsa:openidconnect.profiles:sp:sso:gsa:notify-gov&nonce=NONCE&prompt=select_account&redirect_uri=https://notify-staging.app.cloud.gov/sign-in&response_type=code&scope=openid+email&state=STATE"
LOGIN_DOT_GOV_CERTS_URL: "https://secure.login.gov/api/openid_connect/certs"
API_PUBLIC_URL: ${{ secrets.API_PUBLIC_URL }}
API_PUBLIC_WS_URL: ${{ secrets.API_PUBLIC_WS_URL }}
with:
cf_username: ${{ secrets.CLOUDGOV_USERNAME }}
cf_password: ${{ secrets.CLOUDGOV_PASSWORD }}
@@ -103,19 +95,12 @@ jobs:
--var LOGIN_DOT_GOV_INITIAL_SIGNIN_URL="$LOGIN_DOT_GOV_INITIAL_SIGNIN_URL"
--var LOGIN_DOT_GOV_CERTS_URL="$LOGIN_DOT_GOV_CERTS_URL"
--var LOGIN_PEM="$LOGIN_PEM"
--var API_PUBLIC_URL="$API_PUBLIC_URL"
--var API_PUBLIC_WS_URL="$API_PUBLIC_WS_URL"
--strategy rolling
- name: Check for changes to egress config
id: changed-egress-config
uses: tj-actions/changed-files@v45
with:
files: |
deploy-config/egress_proxy/notify-admin-staging.*.acl
.github/actions/deploy-proxy/action.yml
.github/workflows/deploy.yml
- name: Deploy egress proxy
if: steps.changed-egress-config.outputs.any_changed == 'true'
uses: ./.github/actions/deploy-proxy
env:
CF_USERNAME: ${{ secrets.CLOUDGOV_USERNAME }}

5
.gitignore vendored
View File

@@ -14,6 +14,11 @@
*.XLSX
## Non user files allowed to be commited
!app/assets/pdf/wa_case_study.pdf
!app/assets/pdf/best-practices-for-texting-the-public.pdf
!app/assets/pdf/investing-in-notifications-tts-public-benefits-studio-decision-memo.pdf
!app/assets/pdf/best-practices-section-outline.pdf
!app/assets/pdf/standing-up-your-own-notify.pdf
!app/assets/pdf/tcpa_overview.pdf
!app/assets/pdf/investing-notifications-tts-public-benefits-memo.pdf
!app/assets/pdf/out-of-pilot-announcement.pdf

View File

@@ -8,6 +8,7 @@ repos:
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
exclude: ^app/assets/pdf/.*\.pdf$
- id: debug-statements
- id: check-merge-conflict
- id: check-toml

View File

@@ -6,4 +6,4 @@
export NEW_RELIC_PROXY_HOST=$egress_proxy
export http_proxy=$egress_proxy
export https_proxy=$egress_proxy
export no_proxy="apps.internal"
export no_proxy="apps.internal,s3-fips.us-gov-west-1.amazonaws.com"

View File

@@ -6,6 +6,7 @@ APP_VERSION_FILE = app/version.py
GIT_BRANCH ?= $(shell git symbolic-ref --short HEAD 2> /dev/null || echo "detached")
GIT_COMMIT ?= $(shell git rev-parse HEAD 2> /dev/null || echo "")
GIT_HOOKS_PATH ?= $(shell git config --global core.hooksPath || echo "")
VIRTUALENV_ROOT := $(shell [ -z $$VIRTUAL_ENV ] && echo $$(pwd)/venv || echo $$VIRTUAL_ENV)
@@ -14,16 +15,27 @@ NVMSH := $(shell [ -f "$(HOME)/.nvm/nvm.sh" ] && echo "$(HOME)/.nvm/nvm.sh" || e
## DEVELOPMENT
.PHONY: bootstrap
bootstrap: generate-version-file ## Set up everything to run the app
poetry self add poetry-dotenv-plugin
poetry lock --no-update
poetry install --sync --no-root
bootstrap: ## Set up everything to run the app
make generate-version-file
poetry sync --no-root
poetry run playwright install --with-deps
poetry run pre-commit install
source $(NVMSH) --no-use && nvm install && npm install
source $(NVMSH) && npm ci --no-audit
source $(NVMSH) && npm run build
.PHONY: bootstrap-with-git-hooks
bootstrap-with-git-hooks: ## Sets everything up and accounts for pre-existing git hooks
make generate-version-file
poetry sync --no-root
poetry run playwright install --with-deps
git config --global --unset-all core.hooksPath
poetry run pre-commit install
git config --global core.hookspath "${GIT_HOOKS_PATH}"
source $(NVMSH) --no-use && nvm install && npm install
source $(NVMSH) && npm ci --no-audit
source $(NVMSH) && npm run build
.PHONY: watch-frontend
watch-frontend: ## Build frontend and watch for changes
source $(NVMSH) && npm run watch
@@ -53,7 +65,7 @@ generate-version-file: ## Generates the app version file
@echo -e "__git_commit__ = \"${GIT_COMMIT}\"\n__time__ = \"${DATE}\"" > ${APP_VERSION_FILE}
.PHONY: test
test: py-lint py-test js-lint js-test ## Run tests
test: py-lint py-test js-test ## Run tests
.PHONY: py-lint
py-lint: ## Run python linting scanners and black
@@ -83,18 +95,18 @@ too-complex:
py-test: export NEW_RELIC_ENVIRONMENT=test
py-test: ## Run python unit tests
poetry run coverage run -m pytest --maxfail=10 --ignore=tests/end_to_end tests/
poetry run coverage report --fail-under=96
poetry run coverage report --fail-under=93
poetry run coverage html -d .coverage_cache
.PHONY: dead-code
dead-code: ## 60% is our aspirational goal, but currently breaks the build
poetry run vulture ./app ./notifications_utils --min-confidence=100
.PHONY: e2e-test
e2e-test: export NEW_RELIC_ENVIRONMENT=test
e2e-test: ## Run end-to-end integration tests; note that --browser webkit isn't currently working
DEBUG=pw:api,pw:browser poetry run pytest -vv --browser chromium --browser firefox tests/end_to_end
@echo "Running E2E tests in path: $${TESTPATH:-tests/end_to_end}"
@bash -c 'DEBUG=pw:api,pw:browser poetry run pytest -vv --browser chromium --browser firefox "$${TESTPATH:-tests/end_to_end}"'
.PHONY: js-lint
js-lint: ## Run javascript linting scanners
@@ -115,7 +127,7 @@ py-lock: ## Syncs dependencies and updates lock file without performing recursiv
.PHONY: freeze-requirements
freeze-requirements: ## create static requirements.txt
poetry export --without-hashes --format=requirements.txt > requirements.txt
poetry export --output requirements.txt
.PHONY: pip-audit
pip-audit:

View File

@@ -31,7 +31,7 @@ You will need the following items:
[setting up an account](https://cloud.gov/sign-up/) (requires a `.mil`,
`.gov`, or `.fed.us` email address) and getting access to the
`notify-local-dev` and `notify-staging` spaces.
- Admin priviliges and SSH access on your machine; you may need to work with
- Admin privileges and SSH access on your machine; you may need to work with
your organization's IT support staff if you're not sure or don't currently
have this access.
@@ -308,6 +308,22 @@ you'll be set with an upgraded version of Python.
_If you're not sure about the details of your current virtual environment, you can run `poetry env info` to get more information. If you've been using `pyenv` for everything, you can also see all available virtual environments with `pyenv virtualenvs`._
#### Poetry upgrades ####
If you are doing a new project setup, then after you install poetry you need to install the export plugin
```sh
poetry self add poetry-plugin-export
```
If you are upgrading from poetry 1.8.5, you need to do this:
```sh
curl -sSL https://install.python-poetry.org | python3 - --version 2.1.3
poetry self add poetry-export-plugin
```
#### Updating the .env file for Login.gov
To configure the application for Login.gov, you will need to update the following environment variables in the .env file:

View File

@@ -109,6 +109,7 @@ from app.notify_client.template_statistics_api_client import template_statistics
from app.notify_client.upload_api_client import upload_api_client
from app.notify_client.user_api_client import user_api_client
from app.url_converters import SimpleDateTypeConverter, TemplateTypeConverter
from app.utils.api_health import is_api_down
from app.utils.govuk_frontend_jinja.flask_ext import init_govuk_frontend
from notifications_utils import logging, request_helper
from notifications_utils.formatters import (
@@ -140,11 +141,15 @@ navigation = {
def _csp(config):
asset_domain = config["ASSET_DOMAIN"]
logo_domain = config["LOGO_CDN_DOMAIN"]
api_public_url = config["API_PUBLIC_URL"]
api_public_ws_url = config["API_PUBLIC_WS_URL"]
return {
"default-src": ["'self'", asset_domain],
"frame-src": [
"https://www.youtube.com",
"https://www.youtube-nocookie.com",
"https://www.googletagmanager.com",
],
"frame-ancestors": "'none'",
"form-action": "'self'",
@@ -157,11 +162,14 @@ def _csp(config):
"https://www.googletagmanager.com",
"https://www.google-analytics.com",
"https://dap.digitalgov.gov",
"https://cdn.socket.io",
],
"connect-src": [
"'self'",
"https://gov-bam.nr-data.net",
"https://www.google-analytics.com",
f"{api_public_url}",
f"{api_public_ws_url}",
],
"style-src": ["'self'", asset_domain],
"img-src": ["'self'", asset_domain, logo_domain],
@@ -169,15 +177,26 @@ def _csp(config):
def create_app(application):
@application.after_request
def add_csp_header(response):
existing_csp = response.headers.get("Content-Security-Policy", "")
response.headers["Content-Security-Policy"] = (
existing_csp + "; form-action 'self';"
)
return response
@application.context_processor
def inject_feature_flags():
feature_about_page_enabled = application.config.get(
"FEATURE_ABOUT_PAGE_ENABLED", False
)
# this is where feature flags can be easily added as a dictionary within context
feature_socket_enabled = application.config.get("FEATURE_SOCKET_ENABLED", False)
return dict(
FEATURE_ABOUT_PAGE_ENABLED=feature_about_page_enabled,
FEATURE_SOCKET_ENABLED=feature_socket_enabled,
)
@application.context_processor
def inject_is_api_down():
return {"is_api_down": is_api_down()}
@application.context_processor
def inject_initial_signin_url():
ttl = 24 * 60 * 60
@@ -682,4 +701,4 @@ def slugify(text):
"""
Converts text to lowercase, replaces spaces with hyphens, and removes invalid characters.
"""
return re.sub(r'[^a-z0-9-]', '', re.sub(r'\s+', '-', text.lower()))
return re.sub(r"[^a-z0-9-]", "", re.sub(r"\s+", "-", text.lower()))

View File

@@ -0,0 +1 @@
<svg id="Capa_1" enable-background="new 0 0 512 512" height="512" viewBox="0 0 512 512" width="512" xmlns="http://www.w3.org/2000/svg"><g><g><path d="m468.547 144.82h-63.047v-121.32c0-12.958-10.542-23.5-23.5-23.5h-324c-12.958 0-23.5 10.542-23.5 23.5v84.833c.344 9.931 14.659 9.923 15 0v-33.333h341v69.82h-121.998c-14.312 0-25.954 11.574-25.954 25.8v83.174l-28.866 19.221c-5.511 3.444-5.51 12.168.001 15.611l28.865 19.22v83.174c0 14.226 11.643 25.799 25.954 25.799h121.998v71.68c0 4.687-3.813 8.5-8.5 8.5h-324c-4.687 0-8.5-3.813-8.5-8.5v-20h131.5c7.444 0 13.5-6.056 13.5-13.5v-127.999c0-7.444-6.056-13.5-13.5-13.5h-131.5v-168.021c-.344-9.931-14.659-9.923-15 0v168.021h-3.5c-7.444 0-13.5 6.056-13.5 13.5v128c0 7.444 6.056 13.5 13.5 13.5h3.5v20c0 12.958 10.542 23.5 23.5 23.5h324c12.958 0 23.5-10.542 23.5-23.5v-71.68h11.5c9.931-.344 9.923-14.659 0-15h-148.498c-6.04 0-10.954-4.845-10.954-10.799v-85.173c0-3.779-1.882-7.288-5.031-9.384l-23.492-15.643 23.492-15.644c3.15-2.098 5.031-5.606 5.031-9.384v-85.173c0-5.955 4.914-10.8 10.954-10.8h200.045c6.04 0 10.953 4.845 10.953 10.8v220.401c0 5.955-4.913 10.799-10.953 10.799h-16.436c-9.931.344-9.923 14.659 0 15h16.436c14.311 0 25.953-11.574 25.953-25.799v-220.401c0-14.226-11.643-25.8-25.953-25.8zm-256.047-129.82v9.5c-.353 9.929-14.65 9.922-15 0v-9.5zm-55.333 0v9.5c-.353 9.929-14.65 9.922-15 0v-9.5zm-55.334 0v9.5c-.353 9.929-14.65 9.922-15 0v-9.5zm-52.333 45v-36.5c0-4.687 3.813-8.5 8.5-8.5h13.833v9.5c1.135 29.816 43.876 29.793 45 0v-9.5h10.334v9.5c1.135 29.816 43.876 29.793 45 0v-9.5h10.333v9.5c1.135 29.816 43.876 29.793 45 0v-9.5h154.5c4.687 0 8.5 3.813 8.5 8.5v36.5zm-17 268.5h147v125h-147z"/><path d="m451.356 344.514c2.439-4.507 2.214-9.973-.589-14.264l-69.093-105.771c-5.242-8.361-18.107-8.359-23.35 0l-69.092 105.771c-2.803 4.291-3.028 9.756-.589 14.263s7.139 7.307 12.264 7.307h138.186c5.125 0 9.824-2.799 12.263-7.306zm-148.499-7.694 67.143-102.786 67.143 102.786z"/><path d="m362.5 266.32v31.445c.344 9.931 14.659 9.923 15 0v-31.445c-.344-9.931-14.659-9.923-15 0z"/><path d="m370 310.82c-4.143 0-7.5 3.358-7.5 7.5v2.5c.344 9.931 14.659 9.923 15 0v-2.5c0-4.142-3.357-7.5-7.5-7.5z"/><path d="m91.375 123.094h36.375c9.931-.344 9.923-14.659 0-15h-36.375c-9.931.344-9.923 14.66 0 15z"/><path d="m91.375 149.316h90c9.931-.344 9.923-14.659 0-15h-90c-9.931.344-9.923 14.66 0 15z"/><path d="m91.375 175.539h77.625c9.931-.344 9.923-14.659 0-15h-77.625c-9.931.344-9.923 14.659 0 15z"/><path d="m91.375 225.76h36.375c9.931-.344 9.923-14.659 0-15h-36.375c-9.931.344-9.923 14.66 0 15z"/><path d="m91.375 251.982h90c9.931-.344 9.923-14.659 0-15h-90c-9.931.344-9.923 14.66 0 15z"/><path d="m91.375 278.205h77.625c9.931-.344 9.923-14.659 0-15h-77.625c-9.931.344-9.923 14.659 0 15z"/><path d="m139.354 356.038c-2.93-2.929-7.678-2.929-10.607 0l-22.747 22.747-22.747-22.747c-2.93-2.929-7.678-2.929-10.607 0s-2.929 7.678 0 10.606l22.748 22.748-22.748 22.748c-2.929 2.929-2.929 7.678 0 10.606 2.93 2.929 7.677 2.929 10.607 0l22.747-22.747 22.747 22.747c2.93 2.929 7.677 2.929 10.607 0 2.929-2.929 2.929-7.678 0-10.606l-22.748-22.748 22.748-22.748c2.929-2.928 2.929-7.677 0-10.606z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@@ -220,7 +220,7 @@
var url = type === 'service'
? `/services/${currentServiceId}/daily-stats.json?timezone=${encodeURIComponent(userTimezone)}`
: `/services/${currentServiceId}/daily-stats-by-user.json`;
: `/services/${currentServiceId}/daily-stats-by-user.json?timezone=${encodeURIComponent(userTimezone)}`;
return fetch(url)

View File

@@ -1,27 +0,0 @@
(function(Modules) {
"use strict";
Modules.Autofocus = function() {
this.start = function(component) {
var $component = $(component),
forceFocus = $component.data('forceFocus');
// if the page loads with a scroll position, we can't assume the item to focus onload
// is still where users intend to start
if (($(window).scrollTop() > 0) && !forceFocus) { return; }
// See if the component itself is something we want to send focus to
var target = $component.filter('input, textarea, select');
// Otherwise look inside the component to see if there are any elements
// we want to send focus to
if (target.length === 0) {
target = $('input, textarea, select', $component);
}
target.eq(0).trigger('focus');
};
};
})(window.GOVUK.Modules);

View File

@@ -1,29 +0,0 @@
(function(Modules) {
"use strict";
let isSixDigitHex = value => value.match(/^#[0-9A-F]{6}$/i);
let colourOrWhite = value => isSixDigitHex(value) ? value : '#FFFFFF';
Modules.ColourPreview = function() {
this.start = component => {
this.$input = $(component);
this.$input.closest('.usa-form-group').append(
this.$preview = $('<span class="textbox-colour-preview"></span>')
);
this.$input
.on('input', this.update)
.trigger('input');
};
this.update = () => this.$preview.css(
'background', colourOrWhite(this.$input.val())
);
};
})(window.GOVUK.Modules);

View File

@@ -1,34 +1,69 @@
function announceUploadStatusFromElement() {
const srRegion = document.getElementById('upload-status-live');
const success = document.getElementById('upload-success');
const error = document.getElementById('upload-error');
if (!srRegion) return;
const message = error?.textContent || success?.textContent;
if (message) {
srRegion.textContent = '';
setTimeout(() => {
srRegion.textContent = message + '\u00A0'; // add a non-breaking space
srRegion.focus(); // Optional
}, 300);
}
}
// Exported for use in tests
function initUploadStatusAnnouncer() {
document.addEventListener('DOMContentLoaded', () => {
announceUploadStatusFromElement();
});
}
(function(Modules) {
"use strict";
Modules.FileUpload = function() {
this.submit = () => this.$form.trigger('submit');
this.showCancelButton = () => $('.file-upload-button', this.$form).replaceWith(`
<a href="" class='usa-button usa-button--secondary'>Cancel upload</a>
`);
this.start = function(component) {
this.$form = $(component);
// The label gets styled like a button and is used to hide the native file upload control. This is so that
// users see a button that looks like the others on the site.
this.$form.find('label.file-upload-button').addClass('usa-button margin-bottom-1').attr( {role: 'button', tabindex: '0'} );
// Clear the form if the user navigates back to the page
$(window).on("pageshow", () => this.$form[0].reset());
// Need to put the event on the container, not the input for it to work properly
this.$form.on(
'change', '.file-upload-field',
() => this.submit() && this.showCancelButton()
);
this.showCancelButton = () => {
$('.file-upload-button', this.$form).replaceWith(`
<button class='usa-button uploading-button' aria-disabled="true" tabindex="0">
Uploading<span class="dot-anim" aria-hidden="true"></span>
</button>
`);
};
};
this.start = function(component) {
this.$form = $(component);
this.$form.on('click', '[data-module="upload-trigger"]', function () {
const inputId = $(this).data('file-input-id');
const fileInput = document.getElementById(inputId);
if (fileInput) fileInput.click();
});
$(window).on("pageshow", () => this.$form[0].reset());
this.$form.on('change', '.file-upload-field', () => {
this.submit();
this.showCancelButton();
});
};
};
})(window.GOVUK.Modules);
if (typeof module !== 'undefined' && module.exports) {
module.exports = {
announceUploadStatusFromElement,
initUploadStatusAnnouncer
};
}
if (typeof window !== 'undefined') {
initUploadStatusAnnouncer();
}

View File

@@ -22,7 +22,6 @@
this.$scrollableTable
.on('scroll', this.toggleShadows)
.on('scroll', this.maintainHeight)
.on('focus blur', () => this.$component.toggleClass('js-focus-style'));
if (
window.GOVUK.stickAtBottomWhenScrolling &&
@@ -37,11 +36,11 @@
this.insertShims = () => {
const attributesForFocus = 'role aria-labelledby tabindex';
const attributesForFocus = 'role aria-labelledby';
let captionId = this.$table.find('caption').text().toLowerCase().replace(/[^A-Za-z]+/g, '');
this.$table.find('caption').attr('id', captionId);
this.$table.wrap(`<div class="fullscreen-scrollable-table" role="region" aria-labelledby="${captionId}" tabindex="0"/>`);
this.$table.wrap(`<div class="fullscreen-scrollable-table" role="region" aria-labelledby="${captionId}"/>`);
this.$component
.append(

View File

@@ -1,24 +0,0 @@
(function(window) {
"use strict";
window.GOVUK.Modules.Homepage = function() {
this.start = function(component) {
let $component = $(component);
let iterations = 0;
let timeout = null;
$component.on('click', () => {
if (++iterations == 5) {
$component.toggleClass('product-page-intro-wrapper--alternative');
}
clearTimeout(timeout);
timeout = setTimeout(() => iterations = 0, 1500);
});
};
};
})(window);

View File

@@ -15,6 +15,7 @@
let query = normalize($searchBox.val());
let results = 0;
let $noResultsMessage = $('.js-live-search-no-results');
$targets.each(function() {
@@ -39,6 +40,12 @@
});
if (query !== '' && results === 0) {
$noResultsMessage.show();
} else {
$noResultsMessage.hide();
}
if (state === 'loaded') {
if (query !== '') {
$searchBox.attr('aria-label', $searchLabel.text().trim() + ', ' + resultsSummary(results));

View File

@@ -1,7 +1,5 @@
window.GOVUK.Frontend.initAll();
$(() => $("time.timeago").timeago());
var showHideContent = new GOVUK.ShowHideContent();
showHideContent.init();

View File

@@ -0,0 +1,100 @@
let activeModal = null;
let lastFocusedElement = null;
function openModal(modalId) {
const wrapper = document.getElementById(modalId);
if (!wrapper) return;
const modal = wrapper.querySelector('.usa-modal, dialog');
if (!modal) return;
lastFocusedElement = document.activeElement;
wrapper.classList.remove('is-hidden');
modal.removeAttribute('aria-hidden');
modal.removeAttribute('inert');
modal.removeAttribute('hidden');
document.body.classList.add('modal-open');
// Set focus to the first focusable element inside modal
const focusTarget = modal.querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
if (focusTarget) focusTarget.focus();
modal.addEventListener('keydown', function(e) {
if (e.key !== 'Tab') return;
const focusableElements = modal.querySelectorAll(
'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [tabindex]:not([tabindex="-1"])'
);
const firstElement = focusableElements[0];
const lastElement = focusableElements[focusableElements.length - 1];
if (e.shiftKey && document.activeElement === firstElement) {
e.preventDefault();
lastElement.focus();
} else if (!e.shiftKey && document.activeElement === lastElement) {
e.preventDefault();
firstElement.focus();
}
});
activeModal = wrapper;
}
function closeModal() {
if (!activeModal) return;
const modal = activeModal.querySelector('.usa-modal, dialog');
if (modal) {
modal.setAttribute('aria-hidden', 'true');
modal.setAttribute('inert', '');
modal.setAttribute('hidden', '');
}
activeModal.classList.add('is-hidden');
document.body.classList.remove('modal-open');
if (lastFocusedElement) lastFocusedElement.focus();
activeModal = null;
}
function attachModalTriggers() {
document.querySelectorAll('[data-open-modal]').forEach(btn => {
btn.addEventListener('click', () => {
const modalId = btn.getAttribute('data-open-modal');
openModal(modalId);
});
});
document.querySelectorAll('[data-close-modal]').forEach(btn => {
btn.addEventListener('click', () => {
closeModal();
});
});
}
// Escape key closes modal
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && activeModal) {
closeModal();
}
});
// Optional: click outside modal closes it
document.addEventListener('click', (e) => {
if (activeModal && e.target.classList.contains('usa-modal-overlay')) {
closeModal();
}
});
document.addEventListener('DOMContentLoaded', () => {
attachModalTriggers();
});
// ✅ Check if we're in a Node.js environment (for Jest) before using `module.exports`
if (typeof module !== "undefined" && typeof module.exports !== "undefined") {
module.exports = { closeModal, openModal, attachModalTriggers };
}

View File

@@ -1,30 +1,45 @@
(function() {
(function () {
"use strict";
let disableSubmitButtons = function(event) {
var $submitButton = $(this).find(':submit');
if ($submitButton.data('clicked') == 'true') {
const disableSubmitButtons = function (event) {
const $submitButton = $(this).find(':submit');
if ($submitButton.data('clicked') === 'true') {
event.preventDefault();
} else {
$submitButton.data('clicked', 'true');
setTimeout(renableSubmitButton($submitButton), 1500);
return;
}
$submitButton.data('clicked', 'true');
// Add dot animation for Send/Schedule/Cancel buttons
const buttonName = $submitButton.attr('name')?.toLowerCase();
if (["send", "schedule", "cancel"].includes(buttonName)) {
$submitButton.prop('disabled', true);
// Inject dot animation span if not already present
if ($submitButton.find('.dot-anim').length === 0) {
$submitButton.append('<span class="dot-anim" aria-hidden="true"></span>');
}
// Disable Cancel button too
const $cancelButton = $('button[name]').filter(function () {
return $(this).attr('name')?.toLowerCase() === 'cancel';
});
$cancelButton.prop('disabled', true);
setTimeout(() => {
renableSubmitButton($submitButton);
}, 10000); // fallback safety
} else {
setTimeout(renableSubmitButton($submitButton), 1500);
}
};
let renableSubmitButton = $submitButton => () => {
const renableSubmitButton = ($submitButton) => () => {
$submitButton.data('clicked', '');
$submitButton.prop('disabled', false);
$submitButton.find('.dot-anim').remove(); // clean up if needed
};
$('form').on('submit', disableSubmitButtons);
})();

View File

@@ -38,7 +38,7 @@
<label class="usa-radio__label" for="{{id}}">{{label}}</label>
</div>
{{/choices}}
<input type='button' class='usa-button usa-button--outline radio-select__button--done' aria-expanded='true' value='Done' />
<input type='button' class='usa-button usa-button--outline radio-select__button--done margin-top-4' aria-expanded='true' value='Back to select a new time' />
</div>
`),
'chosen': Hogan.compile(`

View File

@@ -0,0 +1,83 @@
function debounce(func, wait) {
let timeout;
return function (...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
}
document.addEventListener('DOMContentLoaded', function () {
const isJobPage = window.location.pathname.includes('/jobs/');
if (!isJobPage) return;
const jobEl = document.querySelector('[data-job-id]');
const jobId = jobEl?.dataset?.jobId;
const featureEnabled = jobEl?.dataset?.feature === 'true';
const apiHost = jobEl?.dataset?.host;
if (!jobId) return;
if (featureEnabled) {
const socket = io(apiHost);
socket.on('connect_error', (err) => {
console.error('Socket connect_error:', err);
});
socket.on('error', (err) => {
console.error('Socket error:', err);
});
socket.on('connect', () => {
socket.emit('join', { room: `job-${jobId}` });
});
window.addEventListener('beforeunload', () => {
socket.emit('leave', { room: `job-${jobId}` });
});
const debouncedUpdate = debounce((data) => {
updateAllJobSections();
}, 1000);
socket.on('job_updated', (data) => {
if (data.job_id !== jobId) return;
debouncedUpdate(data);
});
}
function updateAllJobSections() {
const resourceEl = document.querySelector('[data-socket-update="status"]');
const url = resourceEl?.dataset?.resource;
if (!url) {
console.warn('No resource URL found for job updates');
return;
}
fetch(url)
.then((res) => res.json())
.then(({ status, counts, notifications }) => {
const sections = {
status: document.querySelector('[data-socket-update="status"]'),
counts: document.querySelector('[data-socket-update="counts"]'),
notifications: document.querySelector(
'[data-socket-update="notifications"]'
),
};
if (status && sections.status) {
sections.status.innerHTML = status;
}
if (counts && sections.counts) {
sections.counts.innerHTML = counts;
}
if (notifications && sections.notifications) {
sections.notifications.innerHTML = notifications;
}
})
.catch((err) => {
console.error('Error fetching job update partials:', err);
});
}
});

View File

@@ -7,13 +7,17 @@ function showError(input, errorElement, message) {
errorElement.textContent = message;
}, 10);
input.classList.add("usa-input--error");
if (input.type !== "radio" && input.type !== "checkbox") {
input.classList.add("usa-input--error");
}
input.setAttribute("aria-describedby", errorElement.id);
}
function hideError(input, errorElement) {
errorElement.style.display = "none";
input.classList.remove("usa-input--error");
if (input.type !== "radio" && input.type !== "checkbox") {
input.classList.remove("usa-input--error");
}
input.removeAttribute("aria-describedby");
}
@@ -24,16 +28,18 @@ function getFieldLabel(input) {
// Attach validation logic to forms
function attachValidation() {
const forms = document.querySelectorAll("form.send-one-off-form");
const forms = document.querySelectorAll('form[data-force-focus="True"]');
forms.forEach((form) => {
const inputs = form.querySelectorAll("input, textarea, select");
form.addEventListener("submit", function (event) {
let isValid = true;
let firstInvalidInput = null;
const validatedRadioNames = new Set();
inputs.forEach((input) => {
const errorId = input.id ? `${input.id}-error` : `${input.name}-error`;
if (input.type === "hidden") return;
const errorId = input.type === "radio" ? `${input.name}-error` : `${input.id}-error`;
let errorElement = document.getElementById(errorId);
if (!errorElement) {
@@ -41,16 +47,24 @@ function attachValidation() {
errorElement.id = errorId;
errorElement.classList.add("usa-error-message");
errorElement.setAttribute("aria-live", "polite");
input.insertAdjacentElement("afterend", errorElement);
errorElement.style.display = "none";
if (input.type === "radio") {
const group = form.querySelectorAll(`input[name="${input.name}"]`);
const lastRadio = group[group.length - 1];
lastRadio.parentElement.insertAdjacentElement("afterend", errorElement);
} else {
input.insertAdjacentElement("afterend", errorElement);
}
}
if (input.type === "radio") {
// Find all radio buttons with the same name
const radioGroup = document.querySelectorAll(`input[name="${input.name}"]`);
if (validatedRadioNames.has(input.name)) return;
validatedRadioNames.add(input.name);
const radioGroup = form.querySelectorAll(`input[name="${input.name}"]`);
const isChecked = Array.from(radioGroup).some(radio => radio.checked);
if (!isChecked) {
showError(input, errorElement, `Error: ${getFieldLabel(input)} must be selected.`);
showError(input, errorElement, `Error: A selection must be made.`);
isValid = false;
if (!firstInvalidInput) {
firstInvalidInput = input;
@@ -72,12 +86,22 @@ function attachValidation() {
});
inputs.forEach((input) => {
if (input.type === "hidden") return;
input.addEventListener("input", function () {
const errorElement = document.getElementById(`${input.id}-error`);
if (input.value.trim() !== "" && errorElement) {
const errorId = input.type === "radio" ? `${input.name}-error` : `${input.id}-error`;
const errorElement = document.getElementById(errorId);
if (errorElement && input.value.trim() !== "") {
hideError(input, errorElement);
}
});
if (input.type === "radio") {
input.addEventListener("change", function () {
const errorElement = document.getElementById(`${input.name}-error`);
if (errorElement) {
hideError(input, errorElement);
}
});
}
});
});
}

View File

@@ -0,0 +1,8 @@
document.addEventListener("DOMContentLoaded", function () {
if (window.uswds && typeof window.uswds.init === 'function') {
console.log("Calling USWDS init");
window.uswds.init();
} else {
console.error("USWDS not found or init is not a function");
}
});

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -49,12 +49,12 @@
}
.sms-message-sender, .sms-message-file-name, .sms-message-scheduler, .sms-message-template, .sms-message-sender {
margin:0.25rem 0 0;
margin: units(0.5) 0 0;
}
.sms-message-recipient {
color: color('gray-cool-90');
margin: units(1) 0 units(1);
margin: units(0.5) 0 units(2);
}
.sms-message-status {
@@ -344,3 +344,43 @@ h2.recipient-list {
}
}
}
.usa-search__input, [type=search] {
border-right: 1px solid;
height: 40px;
margin-top: units(1);
}
.usa-search .search-form__button {
height: 40px;
}
// Button ellipses loading
.dot-anim {
display: inline-block;
margin-left: 0; /* remove left margin if it exists */
padding-left: 0;
font-size: 1em;
animation: dots 1s steps(3, end) infinite;
}
/* Optional: reduce spacing by removing whitespace node */
button span.dot-anim {
margin-left: 0; /* forces no space even if white-space exists */
}
.dot-anim::after {
content: '.';
animation: dotPulse 1.5s steps(3, end) infinite;
}
@keyframes dotPulse {
0% { content: ''; }
33% { content: '.'; }
66% { content: '..'; }
100% { content: '...'; }
}
.modal-open {
overflow: hidden;
}

View File

@@ -139,11 +139,6 @@ td.table-empty-message {
font-family: family('sans');
}
.usa-dark-background .pill-item__label {
color: white;
text-decoration: none !important;
}
.pill-item.usa-link {
text-decoration: none !important;
}
@@ -184,10 +179,19 @@ td.table-empty-message {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
padding: 1rem;
padding: 1rem 0;
}
.user-list-item {
border: 2px solid color('gray-5');
padding: units(2);
button, .usa-accordion__content {
background-color: white;
border: 2px solid color('gray-5');
}
button:hover, button[aria-expanded="true"] {
background-color: color('gray-5');
}
@include at-media(desktop) {
width: calc(50% - units(1));
margin-bottom: 1rem;
@@ -198,16 +202,12 @@ td.table-empty-message {
word-wrap: break-word;
}
// border: 1px solid color('gray-cool-10');
// padding: units(2);
.tick-cross-list-permissions {
margin: units(1) 0;
padding-left: units(2);
}
.hint {
display: block;
font-size: size('body', 'sm');
font-weight: normal;
}
@@ -257,6 +257,11 @@ td.table-empty-message {
}
}
.usa-checkbox.template-list-item.template-list-item-with-checkbox.template-list-item-without-ancestors {
display: flex;
flex-direction: column;
}
.usa-checkbox__label-description {
margin: units(2px) 0 units(1) units(4);
}
@@ -292,6 +297,7 @@ td.table-empty-message {
margin-top: units(1);
width: 100%;
border: 1px solid color('gray-60');
height: 40px;
}
}
@@ -594,19 +600,31 @@ td.table-empty-message {
.big-number-smallest {
font-size: units(3);
}
.pill-item__label {
color: white;
}
&:not(.pill-item--selected):hover {
background: color('blue-warm-70v');
.pill-item__label {
color: white;
}
}
&.pill-item--selected:hover {
color: color('blue-60v');
&.pill-item--selected {
.pill-item__label {
color: color('blue-60v');
}
&:hover {
.pill-item__label {
color: color('blue-60v');
}
}
}
}
}
}
}
// Etc
.email-brand,
.browse-list {
padding: 0;
@@ -1047,3 +1065,7 @@ nav.nav {
.form-control-error {
border: 4px solid #b10e1e
}
.usa-site-alert .usa-alert .usa-alert__body {
max-width: 75rem;
}

View File

@@ -1,5 +1,5 @@
@forward "uswds-theme";
@forward "uswds";
@forward "uswds-theme-custom-styles";
@forward "legacy-styles";
@forward "main";
@forward "data-visualization";

View File

@@ -37,6 +37,7 @@ $path: '/static/images/';
// Custom overrides
.govuk-link {
font-weight: bold;
color: #005ea5;
}
// Specific to this application

View File

@@ -12,6 +12,9 @@ class Config(object):
NOTIFY_APP_NAME = "admin"
NOTIFY_ENVIRONMENT = getenv("NOTIFY_ENVIRONMENT", "development")
API_HOST_NAME = getenv("API_HOST_NAME", "localhost")
API_PUBLIC_URL = getenv("API_PUBLIC_URL", "localhost")
API_PUBLIC_WS_URL = getenv("API_PUBLIC_WS_URL", "localhost")
ADMIN_BASE_URL = getenv("ADMIN_BASE_URL", "http://localhost:6012")
HEADER_COLOUR = (
"#81878b" # mix(govuk-colour("dark-grey"), govuk-colour("mid-grey"))
@@ -88,7 +91,7 @@ class Config(object):
],
}
FEATURE_ABOUT_PAGE_ENABLED = getenv("FEATURE_ABOUT_PAGE_ENABLED", "false") == "true"
FEATURE_SOCKET_ENABLED = getenv("FEATURE_SOCKET_ENABLED", "false") == "true"
def _s3_credentials_from_env(bucket_prefix):
@@ -130,8 +133,9 @@ class Test(Development):
WTF_CSRF_ENABLED = False
ASSET_DOMAIN = "static.example.com"
ASSET_PATH = "https://static.example.com/"
API_HOST_NAME = "http://you-forgot-to-mock-an-api-call-to"
API_PUBLIC_URL = "http://you-forgot-to-mock-an-api-call-to"
API_PUBLIC_WS_URL = "ws://you-forgot-to-mock-an-api-call-to"
REDIS_URL = "redis://you-forgot-to-mock-a-redis-call-to"
LOGO_CDN_DOMAIN = "static-logos.test.com"

View File

@@ -344,7 +344,7 @@ def nl2br(value):
html="escape",
)
).then(utils_nl2br)
)
) # nosec
return ""

View File

@@ -257,7 +257,7 @@ def govuk_text_input_field_widget(
return Markup(
render_template("components/components/input/template.njk", params=params)
)
) # nosec
class GovukTextInputField(StringField):
@@ -690,7 +690,9 @@ def govuk_checkbox_field_widget(self, field, param_extensions=None, **kwargs):
if param_extensions:
merge_jsonlike(params, param_extensions)
return Markup(render_template("forms/fields/checkboxes/macro.njk", params=params))
return Markup(
render_template("forms/fields/checkboxes/macro.njk", params=params)
) # nosec
def govuk_checkboxes_field_widget(
@@ -704,7 +706,7 @@ def govuk_checkboxes_field_widget(
f' data-field-label="{field_label}">'
f" {checkboxes_string}"
f"</div>"
)
) # nosec
return result
@@ -757,12 +759,14 @@ def govuk_checkboxes_field_widget(
return _wrap_in_collapsible(
self.field_label,
Markup(render_template("forms/fields/checkboxes/macro.njk", params=params)),
Markup(
render_template("forms/fields/checkboxes/macro.njk", params=params)
), # nosec
)
else:
return Markup(
render_template("forms/fields/checkboxes/macro.njk", params=params)
)
) # nosec
def govuk_radios_field_widget(self, field, param_extensions=None, **kwargs):
@@ -805,7 +809,7 @@ def govuk_radios_field_widget(self, field, param_extensions=None, **kwargs):
return Markup(
render_template("components/components/radios/template.njk", params=params)
)
) # nosec
class GovukCheckboxField(BooleanField):

View File

@@ -61,7 +61,7 @@ class ValidEmail:
class NoCommasInPlaceHolders:
def __init__(self, message="You cannot put commas between double brackets"):
def __init__(self, message="You cannot put commas between double parenthesis"):
self.message = message
def __call__(self, form, field):
@@ -108,33 +108,17 @@ class OnlySMSCharacters:
)
if non_sms_characters:
raise ValidationError(
"You cannot use {} in {}. {} will not show up properly on everyones phones.".format(
"Please remove the unaccepted character {} in your message, then save again".format(
formatted_list(
non_sms_characters,
conjunction="or",
conjunction="and",
before_each="",
after_each="",
),
{
"sms": "text messages",
}.get(self._template_type),
("It" if len(non_sms_characters) == 1 else "They"),
)
)
# class NoPlaceholders:
# def __init__(self, message=None):
# self.message = message or (
# 'You cant use ((double brackets)) to personalize this message'
# )
# def __call__(self, form, field):
# if Field(field.data).placeholders:
# raise ValidationError(self.message)
class LettersNumbersSingleQuotesFullStopsAndUnderscoresOnly:
regex = re.compile(r"^[a-zA-Z0-9\s\._']+$")

View File

@@ -132,13 +132,18 @@ def get_local_daily_stats_for_last_x_days(stats_utc, user_timezone, days):
@user_has_permissions()
def get_daily_stats_by_user(service_id):
date_range = get_stats_date_range()
stats = service_api_client.get_user_service_notification_statistics_by_day(
days = date_range["days"]
user_timezone = request.args.get("timezone", "UTC")
stats_utc = service_api_client.get_user_service_notification_statistics_by_day(
service_id,
user_id=current_user.id,
start_date=date_range["start_date"],
days=date_range["days"],
days=days,
)
return jsonify(stats)
local_stats = get_local_daily_stats_for_last_x_days(stats_utc, user_timezone, days)
return jsonify(local_stats)
@main.route("/services/<uuid:service_id>/template-usage")

View File

@@ -1,3 +1,5 @@
import logging
from flask import (
abort,
current_app,
@@ -19,20 +21,23 @@ from app.main.views.sub_navigation_dictionaries import (
)
from app.utils.user import user_is_logged_in
logger = logging.getLogger(__name__)
# Hook to check for feature flags
@main.before_request
def check_feature_flags():
if request.path.startswith("/about") and not current_app.config.get(
"FEATURE_ABOUT_PAGE_ENABLED", False
):
abort(404)
# Placeholder for future feature flag checks
# Example:
# if request.path.startswith("/some-feature") and not current_app.config.get("FEATURE_SOME_FEATURE_ENABLED", False):
# abort(404)
pass
@main.route("/test/feature-flags")
def test_feature_flags():
return jsonify(
{"FEATURE_ABOUT_PAGE_ENABLED": current_app.config["FEATURE_ABOUT_PAGE_ENABLED"]}
{"FEATURE_SOCKET_ENABLED": current_app.config["FEATURE_SOCKET_ENABLED"]}
)
@@ -258,11 +263,11 @@ def why_text_messaging():
)
@main.route("/join-notify")
def join_notify():
@main.route("/notify-service-ending")
@user_is_logged_in
def notify_service_ending():
return render_template(
"views/join-notify.html",
navigation_links=about_notify_nav(),
"views/notify-service-ending.html",
)

View File

@@ -23,7 +23,7 @@ def accept_invite(token):
<a href={url_for("main.sign_out")} class="usa-link">Sign out</a>
and click the link again to accept this invite.
"""
)
) # nosec
flash(message=message)
@@ -98,7 +98,7 @@ def accept_org_invite(token):
""".format(
current_user.email_address, url_for("main.sign_out")
)
)
) # nosec
flash(message=message)

View File

@@ -1,10 +1,11 @@
# -*- coding: utf-8 -*-
import os
from functools import partial
from flask import (
Response,
abort,
current_app,
jsonify,
redirect,
render_template,
@@ -57,8 +58,12 @@ def view_job(service_id, job_id):
filter_args = parse_filter_args(request.args)
filter_args["status"] = set_status_filters(filter_args)
api_public_url = os.environ.get("API_PUBLIC_URL")
return render_template(
"views/jobs/job.html",
api_public_url=api_public_url,
FEATURE_SOCKET_ENABLED=current_app.config["FEATURE_SOCKET_ENABLED"],
job=job,
status=request.args.get("status", ""),
updates_url=url_for(
@@ -351,7 +356,7 @@ def _get_job_counts(job):
Markup(
f"""total<span class="usa-sr-only">
{"text message" if job_type == "sms" else job_type}s</span>"""
),
), # nosec
"",
job.notification_count,
],
@@ -359,7 +364,7 @@ def _get_job_counts(job):
Markup(
f"""pending<span class="usa-sr-only">
{message_count_noun(job.notifications_sending, job_type)}</span>"""
),
), # nosec
"pending",
job.notifications_sending,
],
@@ -367,7 +372,7 @@ def _get_job_counts(job):
Markup(
f"""delivered<span class="usa-sr-only">
{message_count_noun(job.notifications_delivered, job_type)}</span>"""
),
), # nosec
"delivered",
job.notifications_delivered,
],
@@ -375,7 +380,7 @@ def _get_job_counts(job):
Markup(
f"""failed<span class="usa-sr-only">
{message_count_noun(job.notifications_failed, job_type)}</span>"""
),
), # nosec
"failed",
job.notifications_failed,
],
@@ -465,4 +470,4 @@ def get_preview_of_content(notification):
notification["personalisation"],
redact_missing_personalisation=True,
).subject
)
) # nosec

View File

@@ -4,6 +4,7 @@ import uuid
from string import ascii_uppercase
from zipfile import BadZipFile
import bleach
from flask import (
abort,
current_app,
@@ -170,7 +171,9 @@ def send_messages(service_id, template_id):
error_message = '<span class="error-message usa-error-message">'
error_message = f"{error_message}{first_field_errors[0]}"
error_message = f"{error_message}</span>"
error_message = Markup(error_message)
# use 'nosec' because we applied bleach.clean to strip dangerous tags
error_message = bleach.clean(error_message)
error_message = Markup(error_message) # nosec
flash(error_message)
column_headings = get_spreadsheet_column_headings_from_template(template)
@@ -478,6 +481,7 @@ def send_one_off_step(service_id, template_id, step_index):
),
template=template,
form=form,
current_placeholder=current_placeholder,
skip_link=get_skip_link(step_index, template),
back_link=back_link,
link_to_upload=(
@@ -557,24 +561,47 @@ def _check_messages(service_id, template_id, upload_id, preview_row, **kwargs):
)
if request.args.get("from_test"):
# TODO: may not be required after letters code removed
back_link = url_for(
"main.send_one_off", service_id=service_id, template_id=template.id
)
back_link_from_preview = url_for(
"main.send_one_off", service_id=service_id, template_id=template.id
)
back_link = {
"href": {
"url": url_for(
"main.send_one_off", service_id=service_id, template_id=template.id
),
"text": "Back to message personalization",
},
"html": "Back to message personalization",
}
back_link_from_preview = {
"href": {
"url": url_for(
"main.send_one_off", service_id=service_id, template_id=template.id
),
"text": "Back to message personalization",
},
"html": "Back to message personalization",
}
choose_time_form = None
else:
back_link = url_for(
"main.send_messages", service_id=service_id, template_id=template.id
)
back_link_from_preview = url_for(
"main.check_messages",
service_id=service_id,
template_id=template.id,
upload_id=upload_id,
)
back_link = {
"href": {
"url": url_for(
"main.send_messages", service_id=service_id, template_id=template.id
),
"text": "Back to upload a file",
},
"html": "Back to upload a file",
}
back_link_from_preview = {
"href": {
"url": url_for(
"main.check_messages",
service_id=service_id,
template_id=template.id,
upload_id=upload_id,
),
"text": "Back to check messages",
},
"html": "Back to check messages",
}
choose_time_form = ChooseTimeForm()
if preview_row < 2:
@@ -752,31 +779,62 @@ def get_back_link(
preview=False,
):
if preview:
return url_for(
"main.check_notification",
service_id=service_id,
template_id=template.id,
)
return {
"href": {
"url": url_for(
"main.check_notification",
service_id=service_id,
template_id=template.id,
),
"text": "Back to select delivery time",
},
"html": "Back to select delivery time",
}
if step_index == 0:
if should_skip_template_page(template._template):
return url_for(
".choose_template",
service_id=service_id,
)
return {
"href": {
"url": url_for(
".choose_template",
service_id=service_id,
),
"text": "Back to all templates",
},
"html": "Back to all templates",
}
else:
return url_for(
".view_template",
return {
"href": {
"url": url_for(
".view_template",
service_id=service_id,
template_id=template.id,
),
"text": "Back to confirm your template",
},
"html": "Back to confirm your template",
}
# fallback for other steps
back_to_text = (
"Back to select recipients"
if step_index == 1
else "Back to message personalization"
)
return {
"href": {
"url": url_for(
"main.send_one_off_step",
service_id=service_id,
template_id=template.id,
)
return url_for(
"main.send_one_off_step",
service_id=service_id,
template_id=template.id,
step_index=step_index - 1,
)
step_index=step_index - 1,
),
"text": back_to_text,
},
"html": back_to_text,
}
def get_skip_link(step_index, template):
@@ -876,7 +934,7 @@ def _check_notification(service_id, template_id, exception=None, **kwargs):
if (not session.get("recipient")) or not all_placeholders_in_session(
template.placeholders
):
raise PermanentRedirect(back_link)
raise PermanentRedirect(back_link["href"]["url"])
template.values = get_recipient_and_placeholders_from_session(
template.template_type
@@ -924,6 +982,10 @@ def get_template_error_dict(exception):
def preview_notification(service_id, template_id):
recipient = get_recipient()
if not recipient:
current_app.logger.warning(
f"No recipient found for service {service_id}, template {template_id}. Redirecting..."
)
return redirect(
url_for(
".send_one_off",

View File

@@ -62,7 +62,7 @@ def _get_access_token(code): # pragma: no cover
code_param = f"code={code}"
url = f"{base_url}{cli_assert}&{cli_assert_type}&{code_param}&grant_type=authorization_code"
headers = {"Authorization": "Bearer %s" % token}
response = requests.post(url, headers=headers)
response = requests.post(url, headers=headers, timeout=30)
response_json = response.json()
id_token = get_id_token(response_json)
@@ -88,10 +88,7 @@ def _get_access_token(code): # pragma: no cover
def _get_user_email_and_uuid(access_token): # pragma: no cover
headers = {"Authorization": "Bearer %s" % access_token}
user_info_url = os.getenv("LOGIN_DOT_GOV_USER_INFO_URL")
user_attributes = requests.get(
user_info_url,
headers=headers,
)
user_attributes = requests.get(user_info_url, headers=headers, timeout=30)
user_email = user_attributes.json()["email"]
user_uuid = user_attributes.json()["sub"]
return user_email, user_uuid

View File

@@ -17,7 +17,7 @@ def _sign_out_at_login_dot_gov():
url = f"{base_url}{client_id}&{post_logout_redirect_uri}"
current_app.logger.info(f"url={url}")
response = requests.post(url)
response = requests.post(url, timeout=30)
# response = requests.post(url)
current_app.logger.info(f"login.gov response: {response.text}")

View File

@@ -56,10 +56,6 @@ def about_notify_nav():
},
],
},
{
"name": "Join Notify",
"link": "main.join_notify",
},
{
"name": "Contact us",
"link": "main.contact",

View File

@@ -680,42 +680,44 @@ def count_content_length(service_id, template_type):
)
def _is_latin1(s):
return bool(s.encode(encoding="latin-1", errors="strict"))
def _get_content_count_error_and_message_for_template(template):
url = "https://en.wikipedia.org/wiki/ISO/IEC_8859-1"
if template.template_type == "sms":
s1 = f"<html><body>Use of characters outside the <a href='{url}'>IEC_8859-1</a> character set may increase "
s2 = "the message fragment count, resulting in additional charges, and these IEC_8859-1 "
s3 = "characters may not display properly on some older mobile devices.</body></html>"
s1 = (
"<html><body>Looks like your template may have one of these characters "
"• ™ ∞ ≤ or ≥ or emoji, which won't save."
)
s2 = "<br>Please remove any unaccepted characters or emojis and try again.</body></html>"
warning = ""
try:
_is_latin1(template.content)
except UnicodeEncodeError:
warning = f"{s1}{s2}{s3}"
# Define characters that should be blocked
BLOCKED_CHARACTERS = {"", "", "", "", ""}
def contains_blocked_characters(content):
"""Check if the content contains explicitly blocked characters."""
return any(c in BLOCKED_CHARACTERS for c in content)
# Check for blocked characters
if contains_blocked_characters(template.content):
warning = f"{s1}{s2}"
return False, Markup(warning) # nosec
# If message is too long, return the length error
if template.is_message_too_long():
return True, (
f"You have "
f"{character_count(template.content_count_without_prefix - SMS_CHAR_COUNT_LIMIT)} "
f"too many"
)
# Show charge message as usual if no warning
if template.placeholders:
return False, (
Markup(
f"Will be charged as {message_count(template.fragment_count, template.template_type)} "
f"(not including personalization). {warning}"
)
)
return False, (
# Markup marks html contents safe so that they render properly. Don't use it if there is user input.
Markup(
f"Will be charged as {message_count(template.fragment_count, template.template_type)}. {warning} "
)
)
return False, Markup(
f"Will be charged as {message_count(template.fragment_count, template.template_type)} "
f"(not including personalization)."
) # nosec
return False, Markup(
f"Will be charged as {message_count(template.fragment_count, template.template_type)}."
) # nosec
@main.route(

View File

@@ -139,14 +139,28 @@ def tour_step(service_id, template_id, step_index):
def _get_tour_step_back_link(service_id, template_id, step_index):
if step_index == 1:
return url_for(".begin_tour", service_id=service_id, template_id=template_id)
return url_for(
".tour_step",
service_id=service_id,
template_id=template_id,
step_index=step_index - 1,
)
return {
"href": {
"url": url_for(
"main.begin_tour", service_id=service_id, template_id=template_id
),
"text": "Back to tour start",
},
"html": "Back to tour start",
}
else:
return {
"href": {
"url": url_for(
"main.tour_step",
service_id=service_id,
template_id=template_id,
step_index=step_index - 1,
),
"text": "Back to previous step",
},
"html": "Back to previous step",
}
@main.route(
@@ -183,12 +197,18 @@ def check_tour_notification(service_id, template_id):
)
)
back_link = url_for(
".tour_step",
service_id=current_service.id,
template_id=template_id,
step_index=len(placeholders),
)
back_link = {
"href": {
"url": url_for(
"main.tour_step",
service_id=current_service.id,
template_id=template_id,
step_index=len(placeholders),
),
"text": "Back to previous step",
},
"html": "Back to previous step",
}
template.values = get_recipient_and_placeholders_from_session(
template.template_type

View File

@@ -28,8 +28,17 @@ def get_csv_upload(service_id, upload_id):
return get_s3_object(*get_csv_location(service_id, upload_id))
def remove_blank_lines(filedata):
# sometimes people upload files with hundreds of blank lines at the end
data = filedata["data"]
cleaned_data = "\r\n".join(line for line in data.splitlines() if line.strip())
filedata["data"] = cleaned_data
return filedata
def s3upload(service_id, filedata):
filedata = remove_blank_lines(filedata)
upload_id = str(uuid.uuid4())
bucket_name, file_location, access_key, secret_key, region = get_csv_location(
service_id, upload_id

View File

@@ -11,10 +11,16 @@
{% include "components/head.html" %}
</head>
<body class="usa-template__body {{ bodyClasses }}">
<div id="upload-status-live"
class="usa-sr-only"
aria-live="assertive"
tabindex="-1"
role="status">
</div>
<script nonce="{{ csp_nonce() }}">document.body.className = ((document.body.className) ? document.body.className + ' js-enabled' : 'js-enabled');</script>
{% block bodyStart %}
{% block extra_javascripts_before_body %}
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WX5NGWF"
<noscript><iframe sandbox src="https://www.googletagmanager.com/ns.html?id=GTM-WX5NGWF"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
{% endblock %}
{% endblock %}
@@ -29,11 +35,37 @@
{% block header %}
{% include 'components/usa_banner.html' %}
{% if not is_api_down %}
{% if current_user.is_authenticated or current_service or current_user.platform_admin %}
<section class="usa-site-alert usa-site-alert--info" aria-label="Site alert,,,,">
<div class="usa-alert">
<div class="usa-alert__body">
<p class="usa-alert__heading text-bold">Notify.gov Service Ending</p>
<p class="usa-alert__text">
GSA will no longer offer the Notify.gov service after June 8th, 2025. Visit
<a class="usa-link" href="/notify-service-ending">Notify.gov Service Ending</a> for more information.
</p>
</div>
</div>
</section>
{% else %}
<section class="usa-site-alert usa-site-alert--emergency usa-site-alert--no-heading" aria-label="Site alert,,,,">
<div class="usa-alert">
<div class="usa-alert__body">
<p class="usa-alert__heading text-bold">Notify.gov Service Ending</p>
<p class="usa-alert__text">
Notify.gov is no longer accepting new partners.
</p>
</div>
</div>
</section>
{% endif %}
{% endif %}
{% include 'components/header.html' %}
{% endblock %}
{% block main %}
<div class="grid-container">
<div class="grid-container minh-mobile">
{% block beforeContent %}
{% block backLink %}{% endblock %}
{% endblock %}
@@ -94,10 +126,10 @@
{% block footer %}
{% if current_service and current_service.research_mode %}
{% set meta_suffix = 'Built by the <a href="https://www.gsa.gov/about-us/organization/federal-acquisition-service/technology-transformation-services/tts-solutions" class="usa-link">Technology Transformation Services</a><span id="research-mode" class="research-mode">research mode</span>' %}
{% set meta_suffix = 'Built by the <a href="https://tts.gsa.gov/" class="usa-link">Technology Transformation Services</a><span id="research-mode" class="research-mode">research mode</span>' %}
{% else %}
{% set commit_hash = ", Latest version: " + config['COMMIT_HASH'] %}
{% set long_link = '<a href="https://www.gsa.gov/about-us/organization/federal-acquisition-service/technology-transformation-services/tts-solutions" class="usa-link">Technology Transformation Services</a>' %}
{% set long_link = '<a href="https://tts.gsa.gov/" class="usa-link">Technology Transformation Services</a>' %}
{% set meta_suffix = "Built by the " + long_link + commit_hash %}
{% endif %}
@@ -108,7 +140,7 @@
<dialog class="usa-modal" id="sessionTimer" aria-labelledby="sessionTimerHeading" aria-describedby="timeLeft">
<div class="usa-modal__content">
<div class="usa-modal__main">
<h2 class="usa-modal__heading" id="sessionTimerHeading">
<h2 class="usa-modal__heading font-body-lg" id="sessionTimerHeading">
Your session will end soon.
<span class="usa-sr-only">Please choose to extend your session or sign out. Your session will expire in 5 minutes or less.</span>
</h2>
@@ -144,7 +176,7 @@
{% block extra_javascripts %}
{% endblock %}
<script type="text/javascript" src="{{ asset_url('javascripts/all.js') }}"></script>
<script type="text/javascript" src="{{ asset_url('js/uswds.min.js') }}"></script>
<script src="{{ asset_url('js/uswds.min.js') }}"></script>
{% endblock %}
</body>
</html>

View File

@@ -4,10 +4,6 @@
{% macro banner(body, type=None, with_tick=False, delete_button=None, subhead=None, context=None, action=None, id=None, thing=None) %}
<div
class='banner{% if type %}-{{ type }}{% endif %}{% if with_tick %}-with-tick{% endif %}'
{% if type == 'dangerous' %}
role='group'
tabindex='-1'
{% endif %}
{% if id %}
id={{ id }}
{% endif %}

View File

@@ -1,3 +1,3 @@
{% macro usaBackLink(params) %}
{%- include "./template.njk" -%}
{%- include "./template.njk" with context %}
{% endmacro %}

View File

@@ -1,4 +1,6 @@
<nav class="usa-breadcrumb" aria-label="Breadcrumb">
<a href="{{ params.href.url or params.href or '#' }}" class="usa-link usa-back-link display-inline-flex {{ params.classes or '' }}"
{%- for attribute, value in params.attributes %} {{ attribute }}="{{ value }}" {% endfor %}>{{ params.html | safe or params.href.text or 'Back' }}</a>
{%- for attribute, value in params.attributes %} {{ attribute }}="{{ value }}" {% endfor %}>
{{- params.html | safe or params.href.text or 'Back' -}}
</a>
</nav>

View File

@@ -1,5 +1,4 @@
{# Determine type of element to use, if not explicitly set -#}
{% if params.element %}
{% set element = params.element | lower %}
{% else %}
@@ -10,26 +9,35 @@
{% endif %}
{% endif %}
{#- Define common attributes that we can use across all element types #}
{# Define common attributes to use across all element types -#}
{%- set commonAttributes %} class="usa-button{% if params.classes %} {{ params.classes }}{% endif %}{% if params.disabled %} usa-button--disabled{% endif %}"{% for attribute, value in params.attributes %} {{attribute}}="{{value}}"{% endfor %}{% endset %}
{#- Define common attributes we can use for both button and input types #}
{# Define attributes for button/input -#}
{%- set buttonAttributes %}{% if params.name %} name="{{ params.name | trim }}"{% endif %} type="{{ params.type if params.type else 'submit' }}"{% if params.disabled %} disabled="disabled" aria-disabled="true"{% endif %}{% if params.preventDoubleClick %} data-prevent-double-click="true"{% endif %}{% endset %}
{%- set buttonAttributes %}{% if params.name %} name="{{ params.name }}"{% endif %} type="{{ params.type if params.type else 'submit' }}"{% if params.disabled %} disabled="disabled" aria-disabled="true"{% endif %}{% if params.preventDoubleClick %} data-prevent-double-click="true"{% endif %}{% endset %}
{#- Actually create a button... or a link! #}
{%- if element == 'a' %}
<a href="{{ params.href if params.href else '#' }}" role="button" draggable="false" {{- commonAttributes | safe }}>
{# Auto-append .dot-anim span for Send/Schedule buttons -#}
{%- set isSendOrSchedule = params.name and (params.name | lower == 'send' or params.name | lower == 'schedule') -%}
{%- set textContent %}
{{ params.html | safe if params.html else params.text }}
</a>
{%- if isSendOrSchedule -%}<span class="dot-anim" aria-hidden="true"></span>{%- endif -%}
{%- endset %}
{%- elseif element == 'button' %}
<button {%- if params.value %} value="{{ params.value }}"{% endif %} {{- buttonAttributes | safe }} {{- commonAttributes | safe }} {% if params.disabled %}disabled{% endif %}>
{{ params.html | safe if params.html else params.text }}
</button>
{# Render the appropriate element -#}
{% if element == 'a' %}
<a href="{{ params.href if params.href else '#' }}" role="button" draggable="false" {{ commonAttributes | safe }}>
{{ textContent | safe }}
</a>
{%- elseif element == 'input' %}
<input value="{{ params.text }}" {{- buttonAttributes | safe }} {{- commonAttributes | safe }}>
{%- endif %}
{% elseif element == 'button' %}
<button
{% if params.value %} value="{{ params.value }}"{% endif %}
{{ buttonAttributes | safe }}
{{ commonAttributes | safe }}
{% if params.disabled %}disabled{% endif %}
>
{{ textContent | safe }}
</button>
{% elseif element == 'input' %}
<input value="{{ params.text }}" {{ buttonAttributes | safe }} {{ commonAttributes | safe }}>
{% endif %}

View File

@@ -2,9 +2,10 @@
{% from "../hint/macro.njk" import usaHint %}
{% from "../label/macro.njk" import usaLabel %}
{#- a record of other elements that we need to associate with the input using
aria-describedby for example hints or error messages -#}
{# Generate a consistent input ID #}
{% set inputId = params.id if params.id else params.label.text | default('unknown') | slugify %}
{% set describedBy = params.describedBy if params.describedBy else "" %}
<div class="usa-form-group {%- if params.errorMessage %} usa-form-group--error{% endif %} {%- if params.formGroup.classes %} {{ params.formGroup.classes }}{% endif %}">
{{ usaLabel({
html: params.label.html,
@@ -12,38 +13,43 @@
classes: params.label.classes,
isPageHeading: params.label.isPageHeading,
attributes: params.label.attributes,
for: params.text
for: inputId
}) | indent(2) | trim }}
{% if params.hint %}
{% set hintId = params.id + '-hint' %}
{% set describedBy = describedBy + ' ' + hintId if describedBy else hintId %}
{{ usaHint({
id: hintId,
classes: params.hint.classes,
attributes: params.hint.attributes,
html: params.hint.html,
text: params.hint.text
}) | indent(2) | trim }}
{% endif %}
{% if params.errorMessage %}
{% set errorId = params.label.text + '-error' %}
{% set describedBy = describedBy + ' ' + errorId if describedBy else errorId %}
{{ usaErrorMessage({
id: errorId,
classes: params.errorMessage.classes,
attributes: params.errorMessage.attributes,
html: params.errorMessage.html,
text: params.errorMessage.text,
visuallyHiddenText: params.errorMessage.visuallyHiddenText,
}) | indent(2) | trim }}
{% endif %}
{% if params.hint %}
{% set hintId = inputId + '-hint' %}
{% set describedBy = describedBy + ' ' + hintId if describedBy else hintId %}
{{ usaHint({
id: hintId,
classes: params.hint.classes,
attributes: params.hint.attributes,
html: params.hint.html,
text: params.hint.text
}) | indent(2) | trim }}
{% endif %}
{% if params.errorMessage %}
{% set errorId = inputId + '-error' %}
{% set describedBy = describedBy + ' ' + errorId if describedBy else errorId %}
{{ usaErrorMessage({
id: errorId,
classes: params.errorMessage.classes,
attributes: params.errorMessage.attributes,
html: params.errorMessage.html,
text: params.errorMessage.text,
visuallyHiddenText: params.errorMessage.visuallyHiddenText,
}) | indent(2) | trim }}
{% endif %}
<input
class="usa-input {%- if params.classes %} {{ params.classes }}{% endif %} {%- if params.errorMessage %} usa-input--error{% endif %}"
id="{{ params.label.text | default('unknown') | slugify }}"
class="usa-input{%- if params.classes %} {{ params.classes }}{% endif %}{%- if params.errorMessage %} usa-input--error{% endif %}"
id="{{ inputId }}"
name="{{ params.name }}"
type="{{ params.type | default('text') }}"
{%- if params.value %} value="{{ params.value }}"{% endif %}
{%- if describedBy %} aria-describedby="{{ describedBy }}"{% endif %}
{%- if describedBy %} aria-describedby="{{ describedBy | trim }}"{% endif %}
{# Uncomment below if you want to use aria-labelledby too
aria-labelledby="{{ inputId }}-label" #}
{%- if params.autocomplete %} autocomplete="{{ params.autocomplete }}"{% endif %}
{%- if params.pattern %} pattern="{{ params.pattern }}"{% endif %}
{%- for attribute, value in params.attributes %} {{ attribute }}="{{ value }}"{% endfor -%}

View File

@@ -2,7 +2,7 @@
{% set labelHtml %}
<label class="usa-label{%- if params.classes %} {{ params.classes }}{% endif %}"
{%- for attribute, value in params.attributes %} {{attribute}}="{{value}}"{% endfor %}
{%- if params.text %} for="{{ params.text | slugify }}"{% endif %}>
{%- if params.for %} for="{{ params.for }}"{% endif %}>
{{ params.html | safe if params.html else params.text }}
</label>
{% endset %}

View File

@@ -27,17 +27,21 @@
</label>
{{ field(**{
'class': 'file-upload-field',
'id': field.name,
'accept': allowed_file_extensions|format_list_items('.{item}')|join(',')|e
}) }}
<label class="file-upload-button" for="{{ field.name }}">
{{ button_text }}
</label>
<button type="button"
class="usa-button file-upload-button"
data-module="upload-trigger"
data-file-input-id="{{ field.name }}">
{{ button_text }}
</button>
{% if alternate_link and alternate_link_text %}
<span class="file-upload-alternate-link">
or <a class="usa-link" href="{{ alternate_link }}">{{ alternate_link_text }}</a>
</span>
{% endif %}
<label class="file-upload-filename" for="{{ field.name }}"></label>
<span class="file-upload-filename" aria-live="polite"></span>
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
{{ usaButton({ "text": "Submit", "classes": "file-upload-submit" }) }}
</form>

View File

@@ -5,7 +5,8 @@
class=None,
id=None,
module=None,
data_kwargs={}
data_kwargs={},
data_force_focus=False
) %}
<form
method="{{ method }}"
@@ -19,6 +20,7 @@
data-{{ key }}="{{ val }}"
{% endif %}
{% endfor %}
{% if data_force_focus %}data-force-focus="{{ data_force_focus }}"{% endif %}
novalidate
>
{{ caller() }}

View File

@@ -1,7 +1,6 @@
{% set is_about_page = request.path.startswith('/about') %}
{% set is_join_notify_page = request.path.startswith('/join-notify') %}
{% set is_contact_page = request.path.startswith('/contact') %}
{% set is_information_section = is_about_page or is_join_notify_page or is_contact_page %}
{% set is_information_section = is_about_page or is_contact_page %}
{% if current_user.is_authenticated %}
{% set navigation = [
@@ -34,7 +33,6 @@
{% else %}
{% set navigation = [
{"href": url_for('main.about_notify'), "text": "About Notify", "active": is_about_page},
{"href": url_for('main.join_notify'), "text": "Join Notify", "active": is_join_notify_page},
{"href": url_for('main.contact'), "text": "Contact us", "active": is_contact_page}
] %}
{% endif %}

View File

@@ -3,7 +3,7 @@
show=False,
form=None,
label=None,
autofocus=False
autofocus=True
) %}
{%- set search_label = label or form.search.label.text %}
@@ -13,7 +13,7 @@
} %}
{% if autofocus %}
{% set x=param_extensions.__setitem__("attributes", {"data-module": "autofocus"}) %}
{% set _ = param_extensions.__setitem__("attributes", {"autofocus": "autofocus"}) %}
{% endif %}
{% if show %}

View File

@@ -5,7 +5,6 @@
highlight_placeholders=False,
autofocus=False,
autosize=False,
colour_preview=False,
help_link=None,
help_link_text=None,
width='2-3',
@@ -13,58 +12,82 @@
safe_error_message=False,
rows=8,
extra_form_group_classes='',
placeholder=''
placeholder='',
input_id=None
) %}
{% set field_id = kwargs.id if kwargs.id is defined else field.id %}
{% set described_by = '' %}
{% if hint %}{% set described_by = described_by + field_id ~ '-hint' %}{% endif %}
{% if field.errors %}
{% if described_by %}{% set described_by = described_by + ' ' %}{% endif %}
{% set described_by = described_by + field_id ~ '-error' %}
{% endif %}
<div
class="usa-form-group{% if field.errors %} usa-form-group--error{% endif %} {{ extra_form_group_classes }}"
data-module="{% if autofocus %}autofocus{% elif colour_preview %}colour-preview{% endif %}"
>
<label class="usa-label" for="{{ field.name }}">
{% if label %}
{{ label }}
{% else %}
{{ field.label.text }}
{% endif %}
<label class="usa-label" for="{{ field_id }}">
{{ label or field.label.text }}
</label>
{% if hint %}
<div class="usa-hint">
<div class="usa-hint" id="{{ field_id }}-hint">
{{ hint }}
</div>
{% endif %}
{% if field.errors %}
<span id="{{ field.name}}-error" class="error-message usa-error-message" data-module="track-error" data-error-type="{{ field.errors[0] }}" data-error-label="{{ field.name }}" tabindex="-1" aria-live="assertive" role="alert">
<span id="{{ field_id }}-error" class="error-message usa-error-message" data-module="track-error" data-error-type="{{ field.errors[0] }}" data-error-label="{{ field.name }}" tabindex="-1" aria-live="assertive" role="alert">
<span class="usa-sr-only">Error:</span>
{% if not safe_error_message %}{{ field.errors[0] }}{% else %}{{ field.errors[0]|safe }}{% endif %}
{% if not safe_error_message %}
{{ field.errors[0] }}
{% else %}
{{ field.errors[0] | safe }}
{% endif %}
</span>
{% endif %}
{%
if highlight_placeholders or autosize
%}
{% if highlight_placeholders or autosize %}
{% set field_class = 'usa-textarea form-control-{} textbox-highlight-textbox'.format(width) %}
{% else %}
{% set field_class = 'form-control-{} {}'.format(width, 'textbox-right-aligned' if suffix else '') %}
{% set field_class = 'usa-input' %}
{% endif %}
{%
set field_class = 'form-control ' + field_class + (
' form-control-error' if field.errors else ''
)
%}
{{ field(
class=field_class,
data_module='enhanced-textbox' if highlight_placeholders or autosize else '',
data_highlight_placeholders='true' if highlight_placeholders else 'false',
rows=rows|string,
placeholder=placeholder,
aria_describedby=field.name+"-error",
required='required' if required else None,
**kwargs
) }}
{% set field_class = 'form-control ' ~ field_class ~ (' form-control-error' if field.errors else '') %}
{% if autosize or highlight_placeholders %}
<textarea
id="{{ field_id }}"
name="{{ field.name }}"
class="{{ field_class }}"
rows="{{ rows }}"
placeholder="{{ placeholder }}"
aria-describedby="{{ described_by.strip() }}"
{% if field.flags.required %}required{% endif %}
data-module="enhanced-textbox"
data-highlight-placeholders="true"
>{{ field._value() }}</textarea>
{% else %}
{% set input_type = 'tel' if 'phone' in field.label.text else 'text' %}
<input
id="{{ field_id }}"
name="{{ field.name }}"
type="{{ input_type }}"
class="{{ field_class }}"
value="{{ field._value() }}"
placeholder="{{ placeholder }}"
aria-describedby="{{ described_by.strip() }}"
{% if field.flags.required %}required{% endif %}
/>
{% endif %}
{% if suffix %}
<span>{{ suffix }}</span>
{% endif %}
{% if help_link and help_link_text %}
<p class="textbox-help-link">
<a class="usa-link" href='{{ help_link }}'>{{ help_link_text }}</a>
<a class="usa-link" href="{{ help_link }}">{{ help_link_text }}</a>
</p>
{% endif %}
</div>

View File

@@ -0,0 +1,17 @@
<section class="grid-container usa-section margin-top-5 margin-bottom-5">
<div class="grid-row flex-justify-center">
<div class="desktop:grid-col-3 tablet:grid-col-4 mobile:grid-col-12 flex-align-center">
<img
class="width-tablet tablet:width-full"
src="{{ asset_url('images/api-error.svg') }}"
alt="Mobile phone showing error screen"/>
</div>
<div class="desktop:grid-col-6 tablet:grid-col-12 padding-left-0 desktop:padding-left-5">
<h1 class="font-body-3xl line-height-sans-2 text-bold">
There's currently a technical issue.
</h1>
<p class="font-body-lg line-height-sans-2">Thank you for your patience while we work on it. Notify will be back soon.</p>
</div>
</div>
</div>
</section>

View File

@@ -7,7 +7,7 @@
</h3>
<div id="m-a2" class="usa-accordion__content usa-prose">
<p class="usa-body">
Use double brackets and ?? to define optional content.
Use double parenthesis and ?? to define optional content.
</p>
<p class="bottom-gutter-1-3">
For example if you only want to show something to people who are under

View File

@@ -7,11 +7,10 @@
</h3>
<div id="personalization" class="usa-accordion__content usa-prose">
<p class="bottom-gutter-1-3">
Use double brackets to personalize your message:
Use double parenthesis to personalize your message:
</p>
{{ usaInsetText({
"text": "Hello ((first name)), your reference is ((ref number))",
"classes": ""})
}}
</div>

View File

@@ -4,7 +4,7 @@
Send a document by email
</h2>
<p class="usa-body">
Use double brackets to add a placeholder field to your template. This will contain a secure link to download the document.
Use double parenthesis to add a placeholder field to your template. This will contain a secure link to download the document.
</p>
{{ usaInsetText({
"text": "Download your document at: ((link_to_file))",

View File

@@ -16,7 +16,10 @@
<li>More effectively deliver program outcomes</li>
<li>Save administrative costs</li>
<li>Implement <a class="use-link usa-link--external"
href="https://digital.gov/resources/delivering-digital-first-public-experience/" target="_blank">21st Century
href="https://digital.gov/resources/delivering-digital-first-public-experience/"
rel="noopener noreferrer"
target="_blank"
aria-label="21st Century IDEA (opens in a new tab)">21st Century
IDEA</a> and other directives</li>
</ul>
<p>Notify.gov is an easy-to-use, web-based platform. It requires no technical expertise or system integration — users
@@ -66,7 +69,6 @@
</li>
{% endfor %}
</ul>
<p><a href="/join-notify">See if Notify is right for you</a></p>
<p>Notify.gov is a product of the <a href="/studio">Public Benefits Studio</a>, a product accelerator inside
the federal government. </p>
</section>

View File

@@ -22,16 +22,26 @@
</ul>
<p>
Notify.gov operates under a full three-year <a class="use-link usa-link--external"
href="https://digital.gov/resources/an-introduction-to-ato/" target="_blank">Authority-to-Operate (ATO)</a>. This
href="https://digital.gov/resources/an-introduction-to-ato/"
target="_blank"
rel="noopener noreferrer"
aria-label="Authority-to-Operate (ATO) (opens in a new tab)">Authority-to-Operate (ATO)</a>. This
federal security authorization process leverages security
controls provided by National Institute of Standards and Technology (NIST).
</p>
<p>
Our infrastructure runs on <a class="use-link usa-link--external" href="https://www.cloud.gov/"
target="_blank">cloud.gov</a> and utilizes several
Our infrastructure runs on <a class="use-link usa-link--external"
href="https://www.cloud.gov/"
target="_blank"
rel="noopener noreferrer"
aria-label="cloud dot gov (opens in a new tab)">cloud.gov</a> and utilizes several
services through Amazon Web
Services (AWS), including <a class="use-link usa-link--external" href="https://aws.amazon.com/sns/" target="_blank">
Services (AWS), including <a class="use-link usa-link--external"
href="https://aws.amazon.com/sns/"
rel="noopener noreferrer"
target="_blank"
aria-label="AWS SNS (opens in a new tab)">
AWS SNS </a> for sending SMS
messages.
</p>
@@ -53,15 +63,22 @@
</p>
<h2>Multi-Factor Authentication</h2>
<p>
Notify.gov uses <a class="use-link usa-link--external" href="https://login.gov/what-is-login/"
target="_blank">Login.gov</a> for enhanced security.
Notify.gov uses <a class="use-link usa-link--external"
href="https://login.gov/what-is-login/"
rel="noopener noreferrer"
target="_blank"
aria-label="Login dot gov (opens in a new tab)">Login.gov</a> for enhanced security.
Login.gov is an extra layer of security created by the government that uses multi-factor authentication and stronger
passwords to protect your account.
</p>
<p>
To access Notify.gov, users will use a Login.gov account associated with their agency (.gov) email with one of the
<a class="use-link usa-link--external" href="https://login.gov/help/get-started/authentication-methods/"
target="_blank">multi-factor authentication
<a class="use-link usa-link--external"
href="https://login.gov/help/get-started/authentication-methods/"
rel="noopener noreferrer"
target="_blank"
aria-label="login dot gov multi-factor authentication methods (opens in a new tab)"
>multi-factor authentication
methods</a> offered through Login.gov.
</p>
</section>

View File

@@ -16,7 +16,9 @@
<p>
Confusing or <a class="use-link usa-link--external"
href="https://kffhealthnews.org/news/tougher-returned-mail-policies-add-to-medicaid-enrollment-drop/"
target="_blank">unreceived notifications</a> are one of the largest barriers to people getting and keeping
target="_blank"
rel="noopener noreferrer"
aria-label="unreceived notifications (opens in a new tab)">unreceived notifications</a> are one of the largest barriers to people getting and keeping
benefits. The typical ways the government communicates with people often fall short. Low income households are more
likely to experience housing instability, which means paper mail, already slow, can easily be missed.
</p>
@@ -24,7 +26,9 @@
<p>
<a class="use-link usa-link--external"
href="https://www.pewresearch.org/internet/fact-sheet/mobile/?tabItem=64e32376-5a21-4b1d-8f8b-5f92406db984"
target="_blank">Pew Research shows that nearly all adults in the US have a cell phone.</a> Reliance on smartphones
target="_blank"
rel="noopener noreferrer"
aria-label="Pew Research shows that nearly all adults in the US have a cell phone (opens in a new tab)">Pew Research shows that nearly all adults in the US have a cell phone.</a> Reliance on smartphones
for online access is especially common among Americans with lower household incomes and those with lower levels of
formal education. Of those earning less than $30,000 a year, 28% say their mobile phone is the sole method to
digitally connect.
@@ -40,8 +44,7 @@
</p>
<p>
Texting not only helps programs reach people using a nearly-universal communication method, it is a cost effective
way to do so. With Notify.gov <a href="/join-notify">you can get started for free</a>, allowing you to try out
texting to complement your existing communications and outreach strategies.
way to do so.
</p>
<h2 id="what-texting-is-best-for">What texting is best for</h2>
<p>

View File

@@ -14,7 +14,7 @@
{{ page_header('About your service') }}
{% call form_wrapper() %}
{% call form_wrapper(data_force_focus=True) %}
{{ form.name(param_extensions={"hint": {"text": "You can change this later"}}) }}

View File

@@ -57,7 +57,7 @@
{{notification.key_name}}
</span>
<span class="grid-col-6 api-notifications-item__meta-time">
<time class="timeago" datetime="{{ notification.created_at }}">
<time datetime="{{ notification.created_at }}">
{{ notification.created_at|format_delta }}
</time>
</span>

View File

@@ -20,7 +20,11 @@ Error
{% 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 %}
@@ -102,7 +106,7 @@ Error
<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 brackets in your template</h1>
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',
@@ -150,7 +154,7 @@ Error
) }}
{% endif %}
</div>
<a href="#content" class="usa-link back-to-top-link">Back to top</a>
<a href="#content" class="usa-link back-to-top-link display-block margin-top-2">Back to top</a>
</div>
{% endif %}

View File

@@ -12,7 +12,7 @@
{% block backLink %}
{{ usaBackLink({ "href": back_link }) }}
{{ usaBackLink(back_link) }}
{% endblock %}
{% block maincolumn_content %}
@@ -21,11 +21,13 @@
{{ template|string }}
<div class="bottom-gutter-3-2">
{# Alert for users of AT #}
<span id="upload-success" class="usa-sr-only">File uploaded successfully</span>
<form method="post" enctype="multipart/form-data" action="{{url_for('main.preview_job', service_id=current_service.id, template_id=template_id, upload_id=upload_id)}}" class='page-footer'>
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
{% if choose_time_form %}
{{ choose_time_form.scheduled_for(param_extensions={
'formGroup': {'classes': 'bottom-gutter-2-3'},
'formGroup': {'classes': ''},
'attributes': {
'data-module': 'radio-select',
'data-categories': choose_time_form.scheduled_for.categories|join(','),
@@ -37,7 +39,7 @@
{% set button_text %}
Preview
{% endset %}
{{ usaButton({ "text": button_text }) }}
{{ usaButton({ "text": button_text, "classes": "margin-top-4" }) }}
</form>
</div>

View File

@@ -13,7 +13,7 @@
{% block backLink %}
{{ usaBackLink({ "href": back_link_from_preview }) }}
{{ usaBackLink(back_link_from_preview) }}
{% endblock %}
{% block maincolumn_content %}
@@ -101,6 +101,9 @@
{% set button_text %}
{{ "Schedule" if scheduled_for else 'Send'}}
{% endset %}
{{ usaButton({ "text": button_text }) }}
{{ usaButton({
"text": button_text,
"name": button_text
}) }}
</form>
{% endblock %}

View File

@@ -16,6 +16,8 @@
{% block maincolumn_content %}
<div class="">
{# Alert for users of AT #}
<span id="upload-failed" class="usa-sr-only">File upload failed</span>
{% call banner_wrapper(type='dangerous') %}
{% if row_errors|length == 1 %}
<div class="usa-alert usa-alert--error" role="alert">

View File

@@ -7,19 +7,10 @@
{% block content_column_content %}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p>Is your organization interested in using Notify.gov? Find more information at <a href="/join-notify">Join
Notify</a> or contact us at <a href="mailto:tts-notify@gsa.gov"
<p>For any questions, contact us at <a href="mailto:tts-notify@gsa.gov"
aria-label="contact us at tts-notify@gsa.gov">tts-notify@gsa.gov</a>.</p>
<p>You can expect a response within one business day.</p>
<div class="usa-summary-box maxw-tablet __web-inspector-hide-shortcut__" role="region"
aria-label="For partnership inquiries">
<div class="usa-summary-box__body">
<div class="usa-summary-box__text">
<p class="margin-0">If you are a current Notify.gov partner and have technical issues or questions, we are available at <a
href="mailto:notify-support@gsa.gov"
aria-label="Email Notify for technical questions at notify-support@gsa.gov">notify-support@gsa.gov</a></p>
</div>
</div>
</div>
<p>If you are a current Notify.gov partner and have technical issues or questions, we are available
at <a href="mailto:notify-support@gsa.gov"
aria-label="Email Notify for technical questions at notify-support@gsa.gov">notify-support@gsa.gov</a></p>
</section>
{% endblock %}

View File

@@ -11,7 +11,8 @@
{% block backLink %}
{{ usaBackLink({
"href": url_for('main.choose_template', service_id=current_service.id, template_folder_id=template_folder_id) if template_folder_id else url_for('main.choose_template', service_id=current_service.id)
"href": url_for('main.choose_template', service_id=current_service.id, template_folder_id=template_folder_id) if template_folder_id else url_for('main.choose_template', service_id=current_service.id),
"html": "Back to all templates"
}) }}
{% endblock %}
@@ -27,8 +28,8 @@
{% set content_hint = 'Your service name will be added to the start of your message. You can turn this off in Settings.' %}
{% endif %}
{% call form_wrapper() %}
<div class="grid-row">
{% call form_wrapper(data_force_focus=True) %}
<div class="grid-container padding-0">
<div class="tablet:grid-col-9 mobile-lg:grid-col-12">
{{ form.name(param_extensions={
"extra_form_group_classes": "margin-bottom-2",
@@ -61,12 +62,12 @@
</div>
</div>
</div>
<div class="grid-row width-full">
<div class="grid-row width-mobile-lg">
<div class="tablet:grid-col-2 mobile-lg:grid-col-12">
{{ page_footer('Save') }}
</div>
<div class="tablet:grid-col-10 mobile-lg:grid-col-12">
<p class="usa-hint margin-top-5 tablet:margin-left-neg-2">
<p class="usa-hint margin-top-5 tablet:margin-left-2">
After saving, you'll have the option to send.
</p>
</div>

View File

@@ -14,19 +14,22 @@
</h1>
{% call form_wrapper(
action=url_for('.find_services_by_name'),
class='usa-search margin-bottom-4'
) %}
{{ form.search(param_extensions={
"label": {"text": "Find services by name, partial name, or service ID"}
}) }}
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
{{ usaButton({
"text": "Search",
"classes": "usa-button search-form__button"
}) }}
{% endcall %}
{% call form_wrapper(
action=url_for('.find_services_by_name'),
class='usa-search margin-bottom-4'
) %}
<div class="display-flex flex-justify-start flex-align-end gap-1 width-full">
{{ form.search(param_extensions={
"label": {"text": "Find services by name, partial name, or service ID"},
"classes": "width-full"
}) }}
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
{{ usaButton({
"text": "Search",
"classes": "usa-button search-form__button"
}) }}
</div>
{% endcall %}
{% call form_wrapper(id='search-form' ) %}
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">

View File

@@ -15,17 +15,20 @@
{% call form_wrapper(
action=url_for('.find_users_by_email'),
class='usa-search margin-bottom-4'
action=url_for('.find_users_by_email'),
class='usa-search margin-bottom-4'
) %}
<div class="display-flex flex-align-end gap-1 width-full">
{{ form.search(param_extensions={
"label": {"text": "Find users by email, or by partial email"}
"label": {"text": "Find users by email, or by partial email"},
"classes": "width-full"
}) }}
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
{{ usaButton({
"text": "Search",
"classes": "search-form__button"
"classes": "usa-button search-form__button"
}) }}
</div>
{% endcall %}
{% call form_wrapper(id='search-form' ) %}

View File

@@ -60,7 +60,7 @@
<p class="hint">This person has never logged in</p>
{% else %}
<p>Last logged in
<time class="timeago" datetime="{{ user.logged_in_at }}">
<time datetime="{{ user.logged_in_at }}">
{{ user.logged_in_at|format_delta }}
</time>
</p>

View File

@@ -23,7 +23,9 @@
<p>
When the <a class="use-link usa-link--external"
href="https://www.cbpp.org/research/food-assistance/targeted-text-message-outreach-can-increase-wic-enrollment-pilots-show"
target="_blank">Center on Budget and Policy Priorities</a> studied WIC, they found key learnings about the
target="_blank"
rel="noopener noreferrer"
aria-label="Center on Budget and Policy Priorities (opens in a new tab)">Center on Budget and Policy Priorities</a> studied WIC, they found key learnings about the
quantity of messages delivered, how people engage with messages, and how they take action.
</p>
@@ -68,8 +70,11 @@
</li>
</ul>
<p>
The <a class="use-link usa-link--external" href="https://codeforamerica.org/resources/texting-playbook/"
target="_blank">Code for Americas Texting
The <a class="use-link usa-link--external"
href="https://codeforamerica.org/resources/texting-playbook/"
target="_blank"
rel="noopener noreferrer"
aria-label="Code for America's Texting Playbook (opens in a new tab)">Code for Americas Texting
Playbook</a>
reported specific learnings around appointment reminders, completing
document submission, and maintenance reminders.

View File

@@ -142,7 +142,9 @@
<p>
The Department of Veterans Affairs provides a <a class="use-link usa-link--external"
href="https://github.com/department-of-veterans-affairs/va.gov-team/blob/master/products/va-notify/notification-guide.md#vanotify-notification-guide"
target="_blank">helpful flow-chart</a> that can help you decide if a text message is needed
target="_blank"
rel="noopener noreferrer"
aria-label="helpful flow-chart (opens in a new tab)">helpful flow-chart</a> that can help you decide if a text message is needed
for the communication problem you are trying to solve.
</p>
<h2>Use a hypothesis framework to plan your campaign</h2>

View File

@@ -101,8 +101,11 @@
<p class="sms-message-wrapper text-left">
{{circle_number(7) }}<b>Dept. of Social Services:</b> Hi {{circle_number(8) }}<b>Julie,</b> Your Medicaid
renewal is closing December 31, 2023. You can renew online at {{circle_number(9) }}<a
class="use-link usa-link--external" href="https://www.application.yourstate.gov" target="_blank"
rel="application.yourstate.gov">https://www.application.yourstate.gov</a> or {{circle_number(10) }}
class="use-link usa-link--external"
href="https://www.application.yourstate.gov"
target="_blank"
rel="application.yourstate.gov"
aria-label="Yourstate dot gov (opens in a new tab)">https://www.application.yourstate.gov</a> or {{circle_number(10) }}
<b>call the number on the back</b> of your Medicaid card.
</p>
</div>

View File

@@ -29,7 +29,10 @@
{% set links = [
{
"p_text": 'The <a class="use-link usa-link--external" href="https://www.fcc.gov/sites/default/files/tcpa-rules.pdf"
target="_blank">Telephone Consumer
target="_blank"
rel="noopener noreferrer"
aria-label="Telephone Consumer Protection Act (TCPA) (opens in a new tab)"
>Telephone Consumer
Protection Act (TCPA)</a> (47 USC § 227) is the federal law that impacts how organizations are allowed to
communicate
in bulk with the public via telephone (including text message or SMS).'
@@ -37,7 +40,9 @@
{
"p_text": 'The <a class="use-link usa-link--external"
href="https://www.fcc.gov/document/fcc-provides-best-practices-enable-critical-health-care-coverage-calls"
target="_blank">FCC has ruled</a> that <b>Federal</b> and <b>State</b> programs are exempt from the TCPA and can
target="_blank"
rel="noopener noreferrer"
aria-label="FCC has ruled (opens in a new tab)">FCC has ruled</a> that <b>Federal</b> and <b>State</b> programs are exempt from the TCPA and can
send
text messages to the public without consent if conducting official business. Without explicit mention in the ruling,
local governments, phone carriers, or any texting intermediaries might require it.'
@@ -52,7 +57,10 @@
case.
For additional questions about the enforcement of the TCPA, you can watch <a class="use-link usa-link--external"
href="https://www.performance.gov/cx/life-experiences/facing-a-financial-shock/outputs/fcc-training/"
target="_blank">a recorded training on public
target="_blank"
rel="noopener noreferrer"
aria-label="a recorded training on public
benefits texting (opens in a new tab)">a recorded training on public
benefits texting</a> provided by the FCC.'
},
] %}
@@ -65,7 +73,9 @@
<h4 class="usa-collection__heading">
<a class="usa-link {% if item.is_downloadable %}usa-link--downloadable{% else %}usa-link--external{% endif %}"
href="{% if item.is_downloadable %}{{ asset_url(item.url_link) }}{% else %}{{ item.url_link }}{% endif %}"
target="_blank">
target="_blank"
rel="noopener noreferrer"
aria-label="{{ item.url_text }} (opens in a new tab)">
{{ item.url_text }}
</a>
</h4>
@@ -119,6 +129,7 @@
process
to keep your phone number list up-to-date. The FCC offers a <a class="use-link usa-link--external"
href="https://www.fcc.gov/reassigned-numbers-database" target="_blank"
aria-label="Reassigned Numbers Database (opens in a new tab)"
rel="Reassigned Numbers Database">Reassigned
Numbers Database</a> to identify phone numbers that may have been reassigned since your agency obtained them.
</p>

View File

@@ -81,7 +81,10 @@
</ul>
<h2>What provoking action looks like</h2>
<p class="padding-bottom-2"><a class="use-link usa-link--external"
href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC10002044/" target="_blank">Evidence
href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC10002044/"
target="_blank"
rel="noopener noreferrer"
aria-label="Evidence shows (opens in a new tab)">Evidence
shows</a> that employing
behavioral science is an effective way to increase the
likelihood of a recipient

View File

@@ -61,7 +61,7 @@
<ol class="list list-number">
<li>Go to the {{ service_link(current_service, 'main.choose_template', 'templates') }} page.</li>
<li>Add a new template or choose an existing template and select <b class="bold">Edit</b>.</li>
<li>Add a placeholder using double brackets. For example: Hello ((first&nbsp;name)), your reference is ((ref&nbsp;number)).</li>
<li>Add a placeholder using double parenthesis. For example: Hello ((first&nbsp;name)), your reference is ((ref&nbsp;number)).</li>
<li>Select <b class="bold">Save</b>.</li>
</ol>
@@ -81,7 +81,7 @@
<ol class="list list-number">
<li>Go to the {{ service_link(current_service, 'main.choose_template', 'templates') }} page.</li>
<li>Add a new template or choose an existing template and select <b class="bold">Edit</b>.</li>
<li>Use double brackets and ?? to define optional content. For example, if you only want to show something to people who are under 18: ((under18??Please get your application signed by a parent or guardian.))</li>
<li>Use double parenthesis and ?? to define optional content. For example, if you only want to show something to people who are under 18: ((under18??Please get your application signed by a parent or guardian.))</li>
<li>Select <b class="bold">Save</b>.</li>
</ol>

View File

@@ -59,7 +59,7 @@ your recipient to manage their benefits and increase follow-through.</p>
<h3>To personalize your content</h3>
<ol class="list">
<li>Add a placeholder to your content by placing two brackets around the personalized elements.</li>
<li>Add a placeholder to your content by placing two parenthesis around the personalized elements.</li>
<li>You can manually enter the personalized content or you can upload a spreadsheet with the details and let Notify do the
work for you.</li>
</ol>
@@ -78,7 +78,7 @@ all or part of the message contingent upon specific criteria associated with the
<h3>To add conditional content</h3>
<ol class="list">
<li>Use two brackets and ?? to define the conditional content.</li>
<li>Use two parenthesis and ?? to define the conditional content.</li>
<li>You can manually enter the conditional content or you can upload a spreadsheet with the personal details and let Notify
do the work for you.</li>
</ol>

View File

@@ -30,6 +30,9 @@
error_message_with_html=True
) }}
{% endif %}
<p>
Team members must be invited directly using their .gov email address, not from forwarded invitations. Invitation links to create a Notify.gov account are active for only 24 hours. Expired invitations can e re-sent from the Team members page.
</p>
{% include 'views/manage-users/permissions.html' %}

View File

@@ -11,10 +11,18 @@
{% block maincolumn_content %}
{{ page_header("Message status") }}
{% if not job.finished_processing %}
<p class="max-width-full">This page refreshes automatically to show the latest message activity delivery rates, details, and reports.<br>You can watch it in progress or check back later.</p>
{% endif %}
<div data-job-id="{{ job.id }}" data-feature="{{FEATURE_SOCKET_ENABLED | lower}}" data-host="{{ api_public_url }}">
{% if not job.finished_processing %}
<div
data-module="update-content"
data-resource="{{ updates_url }}"
{% if FEATURE_SOCKET_ENABLED %}
data-socket-update="status"
{% else %}
data-module="update-content"
{% endif %}
data-key="status"
data-form=""
>
@@ -25,8 +33,12 @@
{% endif %}
{% if not finished %}
<div
data-module="update-content"
data-resource="{{ updates_url }}"
{% if FEATURE_SOCKET_ENABLED %}
data-socket-update="counts"
{% else %}
data-module="update-content"
{% endif %}
data-key="counts"
data-form=""
>
@@ -41,8 +53,12 @@
</p>
{% if not job.processing_finished %}
<div
data-module="update-content"
data-resource="{{ updates_url }}"
{% if FEATURE_SOCKET_ENABLED %}
data-socket-update="notifications"
{% else %}
data-module="update-content"
{% endif %}
data-key="notifications"
data-form=""
>
@@ -51,7 +67,6 @@
{% if not job.processing_finished %}
</div>
{% endif %}
<div> </div>
</div>
{% endblock %}

View File

@@ -30,78 +30,105 @@
</div>
{% if show_search_box %}
<div data-module="autofocus">
<div>
{{ live_search(target_selector='.user-list-item', show=True, form=form) }}
</div>
{% endif %}
<div class="user-list">
<div class="js-live-search-no-results" style="display: none;">
<p class="usa-body margin-0">No results found</p>
</div>
{% for user in users %}
{% if user.status != 'cancelled' %}
<div class="user-list-item">
<h2 class="user-list-item-heading font-body-lg margin-top-0" title="{{ user.email_address }}">
<div class="user-list-item width-full">
<h2 class="user-list-item-heading font-body-lg margin-y-0" title="{{ user.email_address }}">
{%- if user.name -%}
<span class="heading-small live-search-relevant">{{ user.name }}</span>
<span class="heading-small live-search-relevant">{{ user.name }}</span>
{%- else -%}
<span class="heading-small live-search-relevant">{{ user.email_address }}</span>
{%- endif -%}
</h2>
<p class="margin-top-0">
{%- if user.status == 'pending' -%}
<span class="live-search-relevant">{{ user.email_address }}</span><span class="hint">(invited)</span>
{%- elif user.status == 'cancelled' -%}
<span class="live-search-relevant">{{ user.email_address }}</span><span class="hint">(cancelled invite)</span>
<span class="live-search-relevant">{{ user.email_address }}</span>
<span class="hint">(invited)</span>
{%- elif user.status == 'expired' -%}
<span class="live-search-relevant">{{ user.email_address }}</span><span class="hint">(expired invite)</span>
<span class="live-search-relevant">{{ user.email_address }}</span>
<span class="hint">(expired invite)</span>
{%- elif user.id == current_user.id -%}
<span class="live-search-relevant"></span><span class="hint">(you)</span>
{% else %}
<span class="live-search-relevant">{{ user.email_address }}</span>
<span class="hint">(you)</span>
{%- else -%}
<span class="live-search-relevant">{{ user.email_address }}</span>
{% endif %}
</h2>
<h3 class="margin-bottom-0">Permissions</h3>
<ul class="tick-cross-list-permissions">
{% for permission, label in permissions %}
{{ tick_cross(
user.has_permission_for_service(current_service.id, permission),
label
) }}
{% endfor %}
</ul>
{# only show if the service has folders #}
{% if current_service.all_template_folders %}
<p class="usa-body tick-cross-list-hint">
{% set folder_count = user.template_folders_for_service(current_service) | length %}
{% if folder_count == 0 %}
Cannot see any folders
{% elif folder_count != current_service.all_template_folders | length %}
Can see {{ folder_count }} folder{% if folder_count > 1 %}s{% endif %}
{% else %}
Can see all folders
{% endif%}
</p>
{% endif %}
{% if current_service.has_permission('email_auth') %}
<p class="usa-body tick-cross-list-hint">
Signs in with
{{ user.auth_type | format_auth_type(with_indefinite_article=True) }}
</p>
{% endif %}
{% if current_service.has_permission('email_auth') %}
<p class="usa-body tick-cross-list-hint">
Signs in with
{{ user.auth_type | format_auth_type(with_indefinite_article=True) }}
</p>
{% endif %}
{% if current_user.has_permissions('manage_service') %}
{% if user.status == 'pending' or user.status == 'expired' %}
<a class="user-list-edit-link usa-link" href="{{ url_for('.cancel_invited_user', service_id=current_service.id, invited_user_id=user.id)}}">Cancel invitation<span class="usa-sr-only"> for {{ user.email_address }}</span></a>
</p>
<div class="usa-accordion usa-accordion--bordered margin-bottom-2">
<h3 class="margin-bottom-0 usa-accordion__heading">
<button
type="button"
class="usa-accordion__button"
aria-expanded="false"
aria-controls="permissions_{{user.id}}"
>
Permissions
</button>
</h3>
<div id="permissions_{{user.id}}" class="usa-accordion__content usa-prose" hidden>
<ul class="tick-cross-list-permissions">
{% for permission, label in permissions %}
{{ tick_cross(
user.has_permission_for_service(current_service.id, permission),
label
) }}
{% endfor %}
</ul>
{% if current_service.all_template_folders %}
<p class="usa-body tick-cross-list-hint">
{% set folder_count = user.template_folders_for_service(current_service) | length %}
{% if folder_count == 0 %}
Cannot see any folders
{% elif folder_count != current_service.all_template_folders | length %}
Can see {{ folder_count }} folder{% if folder_count > 1 %}s{% endif %}
{% else %}
Can see all folders
{% endif %}
</p>
{% endif %}
{% if user.status == 'expired' %}
<a class="user-list-edit-link usa-link" href="{{ url_for('.resend_invite', service_id=current_service.id, invited_user_id=user.id)}}">Resend invite<span class="usa-sr-only"> for {{ user.email_address }}</span></a>
{% elif user.is_editable_by(current_user) %}
<a class="user-list-edit-link usa-link" href="{{ url_for('.edit_user_permissions', service_id=current_service.id, user_id=user.id)}}">Change details<span class="usa-sr-only"> for {{ user.name }} {{ user.email_address }}</span></a>
{% if current_service.has_permission('email_auth') %}
<p class="usa-body tick-cross-list-hint">
Signs in with
{{ user.auth_type | format_auth_type(with_indefinite_article=True) }}
</p>
{% endif %}
</div>
</div>
{% if current_user.has_permissions('manage_service') %}
{% if user.status == 'pending' or user.status == 'expired' %}
<a class="user-list-edit-link usa-link padding-x-2" href="{{ url_for('.cancel_invited_user', service_id=current_service.id, invited_user_id=user.id) }}">
Cancel invitation<span class="usa-sr-only"> for {{ user.email_address }}</span>
</a>
{% endif %}
{% if user.status == 'expired' %}
<a class="user-list-edit-link usa-link" href="{{ url_for('.resend_invite', service_id=current_service.id, invited_user_id=user.id) }}">
Resend invite<span class="usa-sr-only"> for {{ user.email_address }}</span>
</a>
{% elif user.is_editable_by(current_user) %}
<a class="user-list-edit-link usa-link padding-x-2" href="{{ url_for('.edit_user_permissions', service_id=current_service.id, user_id=user.id) }}">
Change details<span class="usa-sr-only"> for {{ user.name }} {{ user.email_address }}</span>
</a>
{% endif %}
{% endif %}
</div>
{% endif %}
{% endfor %}
</div>
{% endblock %}

View File

@@ -9,7 +9,7 @@
{% endblock %}
{% block backLink %}
{{ usaBackLink({ "href": back_link }) }}
{{ usaBackLink(back_link) }}
{% endblock %}
{% block maincolumn_content %}
@@ -55,7 +55,7 @@
{% if not error %}
{% if choose_time_form %}
{{ choose_time_form.scheduled_for(param_extensions={
'formGroup': {'classes': 'bottom-gutter-2-3'},
'formGroup': {'classes': ''},
'attributes': {
'data-module': 'radio-select',
'data-categories': choose_time_form.scheduled_for.categories|join(','),
@@ -66,8 +66,8 @@
{% set button_text %}
Preview
{% endset %}
{{ usaButton({ "text": button_text }) }}
{% endif %}
{{ usaButton({ "text": button_text, "classes": "margin-top-2" }) }}
{% endif %}
</form>
</div>

View File

@@ -16,9 +16,9 @@
{% block backLink %}
{% if help %}
{{ usaBackLink({ "href": back_link }) }}
{{ usaBackLink(back_link) }}
{% else %}
{{ usaBackLink({ "href": back_link_from_preview }) }}
{{ usaBackLink(back_link_from_preview) }}
{% endif %}
{% endblock %}
@@ -43,7 +43,6 @@
{% endcall %}
</div>
{% elif error == 'message-too-long' %}
{# the only row_errors we can get when sending one off messages is that the message is too long #}
<div class="bottom-gutter">
{% call banner_wrapper(type='dangerous') %}
{% include "partials/check/message-too-long.html" %}
@@ -77,15 +76,62 @@
help='3' if help else 0
)}}" class='page-footer'>
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<!-- <p>Placeholder: This message will be delivered to <b>400 phone numbers</b> and will use a total of <b>800 message parts</b>, leaving Washington DSHS with <b>249,200 message parts remaining</b>.</p> -->
<h3>Does everything look good?</h3>
<h3 class="margin-bottom-">Does everything look good?</h3>
{% if not error %}
{% set button_text %}
{{ "Schedule" if scheduled_for else 'Send'}}
{% endset %}
{{ usaButton({ "text": button_text }) }}
{{ usaButton({
"text": button_text,
"name": button_text
}) }}
{{ usaButton({
"text": "Cancel",
"name": "Cancel",
"classes": "usa-button--secondary",
"type": "button",
"attributes": {
"data-open-modal": "cancelModal"
}
}) }}
{% endif %}
</form>
</div>
<div
class="usa-modal"
data-module="usa-modal"
id="cancelModal"
aria-hidden="true"
role="dialog"
aria-modal="true"
aria-labelledby="cancelModalHeading"
aria-describedby="cancelModalDesc"
>
<div class="usa-modal__content">
<div class="usa-modal__main">
<h2 class="usa-modal__heading font-body-lg" id="cancelModalHeading">Are you sure you want to cancel this message?</h2>
<p id="cancelModalDesc">Your template is saved, but your message and recipient details will not be. Canceling will bring you back to the template selection page.</p>
<div class="usa-modal__footer">
<ul class="usa-button-group">
<li class="usa-button-group__item">
<a href="{{ url_for('main.choose_template', service_id=current_service.id) }}" class="usa-button">Yes, cancel
<span class="usa-sr-only">and return to the template selection page</span></a>
</li>
<li class="usa-button-group__item">
<button class="usa-button usa-button--unstyled padding-105 text-center" data-close-modal type="button">
No, go back <span class="usa-sr-only">to message send</span>
</button>
</li>
</ul>
</div>
</div>
<button class="usa-button usa-modal__close" aria-label="Close this window" data-close-modal type="button">
<svg class="usa-icon" aria-hidden="true" focusable="false" role="img">
<use xlink:href="{{ asset_url('img/sprite.svg') }}#close"></use>
</svg>
</button>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,28 @@
{% extends "base.html" %}
{% set page_title = "Notify.gov Service Ending" %}
{% block per_page_title %}{{page_title}}{% endblock %}
{% block content_column_content %}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p>GSA will no longer offer the Notify.gov service after June 8th, 2025. Current partners will continue to have service access until it is fully suspended. After May 30, partners will no longer be able to send messages, and the full service will be suspended by June 8, 2025.
</p>
<h2>Notify.gov Status Announcement</h2>
<p class="text-italic">Notify.gov was in beta and will no longer be offered by GSA. Operations will be suspended on or before June 8. There is a chance that the service may need to stop sooner. GSA will keep partners informed to the extent possible.</p>
<p class="text-italic">All Notify.gov partners will be moved to trial mode no later than May 30, and will no longer be able to send messages. Partners will be able to access their templates and data through June 8.</p>
<p class="text-italic">We encourage government programs to explore ways to continue utilizing technology to meet people where they are. There are several commercial tools on the market that may work for Notify.gov use cases.</p>
<p class="text-italic">GSA is working to avoid potential disruptions to partners operations and ensure a smooth transition.</p>
<p class="text-italic">This decision is part of GSAs renewed focus on its original mission: to be the backbone of the federal governments administrative operations — streamlining processes, optimizing resources, and ensuring cost-effectiveness. GSA is driven to reducing federal spend, contributing to a more flexible and streamlined government, and delivering value for the American people.</p>
<p class="text-italic">We wish you all the best as you continue your work. </p>
</section>
{% endblock %}

View File

@@ -24,13 +24,13 @@
</h1>
{% if show_search_box %}
<div data-module="autofocus">
<div>
{{ live_search(target_selector='.user-list-item', show=True, form=form) }}
</div>
{% endif %}
<div class="user-list">
{% for user in users %}
{% for user in users %}
<div class="user-list">
<div class="user-list-item">
<div class="grid-row">
<div class="grid-col-9">
@@ -60,8 +60,8 @@
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{% endfor %}
<div class="js-stick-at-bottom-when-scrolling">
{{ usaButton({

View File

@@ -32,7 +32,7 @@
<div class="grid-row bottom-gutter">
{% for noti_type in global_stats %}
<div class="grid-col-6">
<span class="big-number-dark bottom-gutter-2-3">
<span class="big-number-dark">
<span class="big-number-number">
{{ "{:,}".format(noti_type.black_box.number) }}
</span>

Some files were not shown because too many files have changed in this diff Show More