Compare commits

..

481 Commits

Author SHA1 Message Date
ccostino
db20c888f2 Merge pull request #2720 from GSA/clean-up-js
Unnecessary large white space below footer
2025-06-27 17:18:44 -04:00
ccostino
f12b4e29be Merge pull request #2712 from GSA/2709-bug-sorting-error-on-activity-page
Improved job/activity list ordering and display
2025-06-27 15:55:55 -04:00
Beverly Nguyen
01b1004ab5 Unnecessary large white space below footer 2025-06-27 12:40:01 -07:00
ccostino
8146ff995e Merge pull request #2717 from GSA/python_3_12_7
upgrade to python 3.12.9
2025-06-27 10:27:23 -04:00
Kenneth Kehl
ff3b9eb820 upgrade to python 3.12.9 2025-06-27 07:00:45 -07:00
Alex Janousek
9433d287ff Merge pull request #2718 from GSA/dependabot/npm_and_yarn/babel/core-7.27.7
Bump @babel/core from 7.27.4 to 7.27.7
2025-06-27 09:16:29 -04:00
Alex Janousek
a7e1fbefd2 Merge pull request #2719 from GSA/dependabot/npm_and_yarn/rollup-4.44.1
Bump rollup from 4.44.0 to 4.44.1
2025-06-27 09:15:34 -04:00
dependabot[bot]
5fb66ad2b7 Bump rollup from 4.44.0 to 4.44.1
Bumps [rollup](https://github.com/rollup/rollup) from 4.44.0 to 4.44.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.44.0...v4.44.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-26 23:17:28 +00:00
dependabot[bot]
492b6f331b Bump @babel/core from 7.27.4 to 7.27.7
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.27.4 to 7.27.7.
- [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.7/packages/babel-core)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-26 23:17:11 +00:00
ccostino
f97ac4fb18 Merge pull request #2707 from GSA/2636-user-story-improve-folder-permissions-options
Improve folder permissions on invite team member page:
2025-06-26 15:14:13 -04:00
Beverly Nguyen
c8c683a74e pytest 2025-06-26 10:09:33 -07:00
Beverly Nguyen
727c6705d2 flake8 2025-06-26 09:59:03 -07:00
ccostino
bcbe6d1c61 Merge pull request #2716 from GSA/drift_fix
fix drift analysis
2025-06-26 11:34:11 -04:00
Kenneth Kehl
4cc97e8c8c upgrade to python 3.12.7 2025-06-26 07:47:08 -07:00
Kenneth Kehl
2f23ff9d8f fix drift analysis 2025-06-26 07:28:25 -07:00
Alex Janousek
e33097c808 Merge pull request #2714 from GSA/dependabot/npm_and_yarn/jest-30.0.3
Bump jest from 30.0.2 to 30.0.3
2025-06-26 09:45:08 -04:00
Alex Janousek
b6e9198986 Merge pull request #2715 from GSA/dependabot/pip/phonenumbers-9.0.8
Bump phonenumbers from 9.0.7 to 9.0.8
2025-06-26 09:44:54 -04:00
dependabot[bot]
0b28c78e3d Bump phonenumbers from 9.0.7 to 9.0.8
Bumps [phonenumbers](https://github.com/daviddrysdale/python-phonenumbers) from 9.0.7 to 9.0.8.
- [Commits](https://github.com/daviddrysdale/python-phonenumbers/compare/v9.0.7...v9.0.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-25 23:59:57 +00:00
dependabot[bot]
c94f89d828 Bump jest from 30.0.2 to 30.0.3
Bumps [jest](https://github.com/jestjs/jest/tree/HEAD/packages/jest) from 30.0.2 to 30.0.3.
- [Release notes](https://github.com/jestjs/jest/releases)
- [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jestjs/jest/commits/v30.0.3/packages/jest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-25 23:18:11 +00:00
Beverly Nguyen
bde035187d isort 2025-06-25 14:32:54 -07:00
ccostino
fc128d8240 Merge pull request #2713 from GSA/revert_python_upgrade_again
revert python upgrade again
2025-06-25 17:18:59 -04:00
Beverly Nguyen
2868a86f55 isort and remove sorting from ui 2025-06-25 14:01:23 -07:00
Kenneth Kehl
68ceda6db5 revert python upgrade again 2025-06-25 13:38:29 -07:00
Beverly Nguyen
5007523d79 Improved job/activity list ordering and display. Jobs are now shown by most recent activity (processing started or created) 2025-06-25 13:25:01 -07:00
ccostino
18dba4d68c Merge pull request #2699 from GSA/upgrade_python_again
upgrade python again to 3.13.2
2025-06-25 15:43:47 -04:00
Kenneth Kehl
3aca70ca4e merge from main 2025-06-25 07:24:32 -07:00
Alex Janousek
543e8f2f44 Merge pull request #2710 from GSA/dependabot/pip/eventlet-0.40.1
Bump eventlet from 0.40.0 to 0.40.1
2025-06-25 10:20:36 -04:00
dependabot[bot]
a16386445a Bump eventlet from 0.40.0 to 0.40.1
Bumps [eventlet](https://github.com/eventlet/eventlet) from 0.40.0 to 0.40.1.
- [Changelog](https://github.com/eventlet/eventlet/blob/master/NEWS)
- [Commits](https://github.com/eventlet/eventlet/compare/0.40.0...0.40.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-25 12:53:45 +00:00
Alex Janousek
2f1ffb443d Merge pull request #2711 from GSA/dependabot/pip/python-dotenv-1.1.1
Bump python-dotenv from 1.1.0 to 1.1.1
2025-06-25 08:51:53 -04:00
dependabot[bot]
d15f9e583c Bump python-dotenv from 1.1.0 to 1.1.1
Bumps [python-dotenv](https://github.com/theskumar/python-dotenv) from 1.1.0 to 1.1.1.
- [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.1.0...v1.1.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-24 23:12:47 +00:00
Alex Janousek
429022f892 Merge pull request #2708 from GSA/dependabot/pip/numpy-2.3.1
Bump numpy from 2.3.0 to 2.3.1
2025-06-24 08:30:19 -04:00
dependabot[bot]
b1ae92a549 Bump numpy from 2.3.0 to 2.3.1
Bumps [numpy](https://github.com/numpy/numpy) from 2.3.0 to 2.3.1.
- [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.3.0...v2.3.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-24 01:34:47 +00:00
Beverly Nguyen
b84f2983ce Merge pull request #2688 from GSA/2032-bug-redirect-after-user-register-is-going-to-an-error-page
redirecting users to 404
2025-06-23 17:54:35 -07:00
Beverly Nguyen
de67064c41 jest test and css 2025-06-23 17:52:54 -07:00
Beverly Nguyen
cdfbc79982 jest test 2025-06-23 15:13:24 -07:00
Beverly Nguyen
9414929b8a Improve folder permissions on invite team member page:
- Default folder permissions to unchecked instead of all selected
- Add Select all/Deselect all toggle button that appears when expanded
2025-06-23 15:05:36 -07:00
Alex Janousek
add3ace98a Merge pull request #2691 from GSA/dependabot/pip/newrelic-10.14.0
Bump newrelic from 10.13.0 to 10.14.0
2025-06-23 16:22:05 -04:00
alexjanousekGSA
3d0d3c675e Fixed audit issue 2025-06-23 15:47:37 -04:00
Alex Janousek
313b4f499c Merge pull request #2695 from GSA/dependabot/npm_and_yarn/playwright-1.53.1
Bump playwright from 1.53.0 to 1.53.1
2025-06-23 15:44:07 -04:00
alexjanousekGSA
cdce255de0 Fixed audit issue 2025-06-23 15:37:33 -04:00
Kenneth Kehl
d317240ddf ugh 2025-06-23 12:09:24 -07:00
Kenneth Kehl
80e1540b28 Merge branch 'main' into upgrade_python_again 2025-06-23 11:39:02 -07:00
Alex Janousek
310806b736 Merge pull request #2702 from GSA/dependabot/npm_and_yarn/jest-30.0.2
Bump jest from 30.0.0 to 30.0.2
2025-06-23 12:18:25 -04:00
Alex Janousek
36bf5ff948 Merge pull request #2706 from GSA/dependabot/pip/flake8-7.3.0
Bump flake8 from 7.2.0 to 7.3.0
2025-06-23 12:18:00 -04:00
dependabot[bot]
79f7276769 Bump flake8 from 7.2.0 to 7.3.0
Bumps [flake8](https://github.com/pycqa/flake8) from 7.2.0 to 7.3.0.
- [Commits](https://github.com/pycqa/flake8/compare/7.2.0...7.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-20 23:09:09 +00:00
dependabot[bot]
f8100e8db4 Bump jest from 30.0.0 to 30.0.2
Bumps [jest](https://github.com/jestjs/jest/tree/HEAD/packages/jest) from 30.0.0 to 30.0.2.
- [Release notes](https://github.com/jestjs/jest/releases)
- [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jestjs/jest/commits/v30.0.2/packages/jest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-20 19:04:48 +00:00
Alex Janousek
a109fe1882 Merge pull request #2703 from GSA/dependabot/npm_and_yarn/jest-each-30.0.2
Bump jest-each from 30.0.0 to 30.0.2
2025-06-20 15:03:27 -04:00
dependabot[bot]
5b758f79bc Bump jest-each from 30.0.0 to 30.0.2
Bumps [jest-each](https://github.com/jestjs/jest/tree/HEAD/packages/jest-each) from 30.0.0 to 30.0.2.
- [Release notes](https://github.com/jestjs/jest/releases)
- [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jestjs/jest/commits/v30.0.2/packages/jest-each)

---
updated-dependencies:
- dependency-name: jest-each
  dependency-version: 30.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-20 15:33:27 +00:00
Alex Janousek
85dd0eba92 Merge pull request #2704 from GSA/dependabot/npm_and_yarn/rollup-4.44.0
Bump rollup from 4.43.0 to 4.44.0
2025-06-20 11:32:37 -04:00
Alex Janousek
f8b634942d Merge pull request #2705 from GSA/dependabot/npm_and_yarn/jest-environment-jsdom-30.0.2
Bump jest-environment-jsdom from 30.0.0 to 30.0.2
2025-06-20 11:32:10 -04:00
dependabot[bot]
8f7ba56d6f Bump jest-environment-jsdom from 30.0.0 to 30.0.2
Bumps [jest-environment-jsdom](https://github.com/jestjs/jest/tree/HEAD/packages/jest-environment-jsdom) from 30.0.0 to 30.0.2.
- [Release notes](https://github.com/jestjs/jest/releases)
- [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jestjs/jest/commits/v30.0.2/packages/jest-environment-jsdom)

---
updated-dependencies:
- dependency-name: jest-environment-jsdom
  dependency-version: 30.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-19 23:49:21 +00:00
dependabot[bot]
25b955d597 Bump rollup from 4.43.0 to 4.44.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.43.0 to 4.44.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.43.0...v4.44.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-19 23:49:11 +00:00
Alex Janousek
83d91ee91a Merge pull request #2694 from GSA/dependabot/pip/pytest-8.4.1
Bump pytest from 8.4.0 to 8.4.1
2025-06-19 17:43:25 -04:00
dependabot[bot]
c039916312 Bump pytest from 8.4.0 to 8.4.1
Bumps [pytest](https://github.com/pytest-dev/pytest) from 8.4.0 to 8.4.1.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/8.4.0...8.4.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-19 21:37:36 +00:00
Alex Janousek
7c964bf448 Merge pull request #2692 from GSA/dependabot/pip/markdown-3.8.1
Bump markdown from 3.8 to 3.8.1
2025-06-19 17:35:41 -04:00
Beverly Nguyen
ba02acf837 Merge branch 'main' into 2032-bug-redirect-after-user-register-is-going-to-an-error-page 2025-06-19 11:12:19 -07:00
dependabot[bot]
710d942f49 Bump markdown from 3.8 to 3.8.1
Bumps [markdown](https://github.com/Python-Markdown/markdown) from 3.8 to 3.8.1.
- [Release notes](https://github.com/Python-Markdown/markdown/releases)
- [Changelog](https://github.com/Python-Markdown/markdown/blob/master/docs/changelog.md)
- [Commits](https://github.com/Python-Markdown/markdown/compare/3.8...3.8.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-19 17:56:11 +00:00
Alex Janousek
6aa866e113 Merge pull request #2701 from GSA/audit-updates
Fixing audit issue
2025-06-19 13:54:09 -04:00
alexjanousekGSA
8161e68c25 Fixing audit issue 2025-06-19 13:29:12 -04:00
Kenneth Kehl
f73b44abba upgrade to urllib 2.5.0 due to pip audit 2025-06-19 07:07:02 -07:00
Kenneth Kehl
bc28e3e2f9 upgrade python again to 3.13.2 2025-06-19 06:58:20 -07:00
dependabot[bot]
b31686d6f2 Bump playwright from 1.53.0 to 1.53.1
Bumps [playwright](https://github.com/microsoft/playwright) from 1.53.0 to 1.53.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.53.0...v1.53.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-18 23:50:55 +00:00
dependabot[bot]
c5b8b318fe Bump newrelic from 10.13.0 to 10.14.0
Bumps [newrelic](https://github.com/newrelic/newrelic-python-agent) from 10.13.0 to 10.14.0.
- [Release notes](https://github.com/newrelic/newrelic-python-agent/releases)
- [Commits](https://github.com/newrelic/newrelic-python-agent/compare/v10.13.0...v10.14.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-18 23:22:02 +00:00
Beverly Nguyen
3755922a6a upgrade urllib3 2025-06-18 15:26:49 -07:00
Beverly Nguyen
6ba59915a6 Merge branch 'main' into 2032-bug-redirect-after-user-register-is-going-to-an-error-page 2025-06-18 15:20:47 -07:00
Beverly Nguyen
a4d19648b2 pytest 2025-06-18 15:14:53 -07:00
Alex Janousek
f9e9c840da Merge pull request #2690 from GSA/feature/backstopjs-updates
Updated backstop reference files
2025-06-18 16:08:41 -04:00
Beverly Nguyen
775a14583d flake8 2025-06-18 10:05:33 -07:00
Beverly Nguyen
063c4b6362 Merge branch 'main' into 2032-bug-redirect-after-user-register-is-going-to-an-error-page 2025-06-18 09:56:51 -07:00
Beverly Nguyen
3fbbb1b06d flake8 2025-06-18 09:51:31 -07:00
alexjanousekGSA
856a68e7dc Updated backstop reference files 2025-06-18 12:36:12 -04:00
Kenneth Kehl
fa3b013a38 Merge pull request #2664 from GSA/import_python_client
bring code from the notifications-python-client project into our project
2025-06-18 07:25:32 -07:00
Alex Janousek
ab3584bd9a Merge pull request #2689 from GSA/dependabot/pip/bandit-1.8.5
Bump bandit from 1.8.3 to 1.8.5
2025-06-18 09:23:24 -04:00
Beverly Nguyen
d620243e32 test 2025-06-17 18:08:41 -07:00
Beverly Nguyen
17ec285130 isort 2025-06-17 17:44:44 -07:00
dependabot[bot]
eaaa7e6b41 Bump bandit from 1.8.3 to 1.8.5
Bumps [bandit](https://github.com/PyCQA/bandit) from 1.8.3 to 1.8.5.
- [Release notes](https://github.com/PyCQA/bandit/releases)
- [Commits](https://github.com/PyCQA/bandit/compare/1.8.3...1.8.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-17 23:49:12 +00:00
Beverly Nguyen
c2cda68059 flake8 2025-06-17 15:47:16 -07:00
Beverly Nguyen
519f8f7f7d redirecting users to 404 2025-06-17 15:31:58 -07:00
Alex Janousek
f4ecc73b48 Merge pull request #2687 from GSA/dependabot-updates
Updated packages to stay ahead of dependabot
2025-06-17 12:55:53 -04:00
Beverly Nguyen
deae07d301 Merge pull request #2682 from GSA/2351-remove-send-text-messages-settings-page-from-permissioned-view
Disabled the user’s ability to toggle SMS on or off
2025-06-17 09:55:34 -07:00
alexjanousekGSA
8db4ca47cd Updated packages 2025-06-17 12:17:18 -04:00
Kenneth Kehl
8b31f73d53 merge from main 2025-06-17 09:08:37 -07:00
Kenneth Kehl
1253b9b226 Merge pull request #2675 from GSA/2545-bug-delete-template-is-not-available-for-all-template-view
Allow users with manage template permission to delete templates
2025-06-17 09:04:06 -07:00
Alex Janousek
3af96cca37 Merge pull request #2684 from GSA/dependabot/pip/certifi-2025.6.15
Bump certifi from 2025.4.26 to 2025.6.15
2025-06-17 10:38:19 -04:00
dependabot[bot]
1841eb85ad Bump certifi from 2025.4.26 to 2025.6.15
Bumps [certifi](https://github.com/certifi/python-certifi) from 2025.4.26 to 2025.6.15.
- [Commits](https://github.com/certifi/python-certifi/compare/2025.04.26...2025.06.15)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-17 14:31:04 +00:00
Alex Janousek
ad1174b80c Merge pull request #2683 from GSA/dependabot/pip/moto-5.1.6
Bump moto from 5.1.5 to 5.1.6
2025-06-17 10:29:30 -04:00
Alex Janousek
38c760088c Merge pull request #2685 from GSA/dependabot/pip/cachetools-6.1.0
Bump cachetools from 6.0.0 to 6.1.0
2025-06-17 10:29:04 -04:00
Alex Janousek
deb8168740 Merge pull request #2686 from GSA/dependabot/npm_and_yarn/rollup/plugin-commonjs-28.0.5
Bump @rollup/plugin-commonjs from 28.0.3 to 28.0.5
2025-06-17 10:28:52 -04:00
Alex Janousek
e616811c81 Merge pull request #2668 from GSA/dependabot/npm_and_yarn/jest-environment-jsdom-30.0.0
Bump jest-environment-jsdom from 29.7.0 to 30.0.0
2025-06-16 23:02:51 -04:00
alexjanousekGSA
fe0f8f98ad Added polyfills to coverage 2025-06-16 22:52:08 -04:00
alexjanousekGSA
648324b7b9 Fixing more tests 2025-06-16 22:36:47 -04:00
dependabot[bot]
3d8c557ec5 Bump @rollup/plugin-commonjs from 28.0.3 to 28.0.5
Bumps [@rollup/plugin-commonjs](https://github.com/rollup/plugins/tree/HEAD/packages/commonjs) from 28.0.3 to 28.0.5.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/commonjs/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/commonjs-v28.0.5/packages/commonjs)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-17 01:06:38 +00:00
dependabot[bot]
11c9c1301f Bump cachetools from 6.0.0 to 6.1.0
Bumps [cachetools](https://github.com/tkem/cachetools) from 6.0.0 to 6.1.0.
- [Changelog](https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/tkem/cachetools/compare/v6.0.0...v6.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-17 01:05:41 +00:00
dependabot[bot]
982d949e5e Bump moto from 5.1.5 to 5.1.6
Bumps [moto](https://github.com/getmoto/moto) from 5.1.5 to 5.1.6.
- [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.5...5.1.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-17 00:41:53 +00:00
alexjanousekGSA
4abf4068a9 Improving code coverage 2025-06-16 20:30:44 -04:00
alexjanousekGSA
f12a977608 More tests fixed 2025-06-16 20:17:43 -04:00
alexjanousekGSA
468216fdf9 Removed unused imports 2025-06-16 19:42:08 -04:00
alexjanousekGSA
a57811a8a8 Updated tests to mock new immutable window location object 2025-06-16 19:33:32 -04:00
Beverly Nguyen
0fe16e2ba7 Merge pull request #2679 from GSA/2640-bug-team-member-page-displays-no-results-found-even-when-there-are-results
fixed the conditional for no results found
2025-06-16 16:07:08 -07:00
Beverly Nguyen
740cdcd7a3 fix pytest 2025-06-16 15:56:43 -07:00
Beverly Nguyen
ae0715eee5 comment out user's ability to turn on/off sms 2025-06-16 15:44:40 -07:00
Kenneth Kehl
29084860d4 merge from main 2025-06-16 07:14:31 -07:00
Alex Janousek
295e7a23e3 Merge pull request #2681 from GSA/dependabot/pip/coverage-7.9.1
Bump coverage from 7.9.0 to 7.9.1
2025-06-14 07:29:05 -04:00
Alex Janousek
286ee10240 Merge pull request #2680 from GSA/dependabot/pip/numpy-2.3.0
Bump numpy from 2.2.6 to 2.3.0
2025-06-14 07:26:55 -04:00
dependabot[bot]
0f834132b9 Bump coverage from 7.9.0 to 7.9.1
Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.9.0 to 7.9.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.9.0...7.9.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-13 23:57:40 +00:00
dependabot[bot]
6495633931 Bump numpy from 2.2.6 to 2.3.0
Bumps [numpy](https://github.com/numpy/numpy) from 2.2.6 to 2.3.0.
- [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.6...v2.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-12 23:32:15 +00:00
Beverly Nguyen
a07aa29c7f again 2025-06-12 15:28:02 -07:00
Beverly Nguyen
e9eef359d5 Merge branch 'main' into 2640-bug-team-member-page-displays-no-results-found-even-when-there-are-results 2025-06-12 15:18:47 -07:00
Beverly Nguyen
b97d378231 fixed the conditional for no results found 2025-06-12 14:08:34 -07:00
Beverly Nguyen
b174e1d675 allowing users with manage template permission to delete templates 2025-06-12 11:54:10 -07:00
ccostino
e81f27b3b0 Merge pull request #2672 from GSA/dependabot/npm_and_yarn/rollup-4.43.0
Bump rollup from 4.42.0 to 4.43.0
2025-06-12 10:04:08 -04:00
ccostino
e1e62f3567 Merge pull request #2671 from GSA/dependabot/pip/coverage-7.9.0
Bump coverage from 7.8.2 to 7.9.0
2025-06-12 08:33:13 -04:00
dependabot[bot]
3e9ad2ef17 Bump rollup from 4.42.0 to 4.43.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.42.0 to 4.43.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.42.0...v4.43.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-11 23:40:58 +00:00
dependabot[bot]
fc9686b202 Bump coverage from 7.8.2 to 7.9.0
Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.8.2 to 7.9.0.
- [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.2...7.9.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-11 23:37:44 +00:00
ccostino
63ec371db1 Merge pull request #2663 from GSA/2253-bug-on-template-page
Fixes for several bugs on the templates page related to form submission issues
2025-06-11 17:52:32 -04:00
Beverly Nguyen
5bdb4cb3b5 added backlinks 2025-06-11 14:21:35 -07:00
Beverly Nguyen
3354b38b8e adding choose 2025-06-11 14:12:49 -07:00
Beverly Nguyen
97c1093de7 dynamically update title and page descriptions 2025-06-11 14:09:17 -07:00
Beverly Nguyen
dec0fb4e63 jest test 2025-06-11 13:37:23 -07:00
ccostino
db5c74b861 Merge pull request #2639 from GSA/2579-updating-homepage-content-at-end-of-may
updating-homepage-content-at-end-of-may
2025-06-11 15:43:20 -04:00
Beverly Nguyen
7452a3675c e2e 2025-06-11 12:31:13 -07:00
Beverly Nguyen
6c07780872 Merge branch 'main' into 2253-bug-on-template-page 2025-06-11 11:39:14 -07:00
Beverly Nguyen
87d5253bc1 updated content 2025-06-11 11:35:10 -07:00
Beverly Nguyen
518e2b5bce Merge branch 'main' into 2579-updating-homepage-content-at-end-of-may 2025-06-11 11:31:44 -07:00
Beverly Nguyen
b1cbcace38 updated title 2025-06-11 11:30:33 -07:00
Kenneth Kehl
64c9e4c088 add poetry.lock ugh 2025-06-11 10:27:31 -07:00
Kenneth Kehl
b84c16a136 Merge branch 'main' into import_python_client 2025-06-11 07:25:53 -07:00
Kenneth Kehl
46f665d0c1 fix codeql warning 2025-06-11 07:13:24 -07:00
Alex Janousek
2648e10f42 Merge pull request #2643 from GSA/dependabot/npm_and_yarn/gulp-5.0.1
Bump gulp from 5.0.0 to 5.0.1
2025-06-10 20:51:00 -04:00
alexjanousekGSA
7cd6bc2725 Updated function name 2025-06-10 20:42:55 -04:00
alexjanousekGSA
9293bece83 Added config 2025-06-10 20:24:08 -04:00
dependabot[bot]
b4b8435fb7 Bump jest-environment-jsdom from 29.7.0 to 30.0.0
Bumps [jest-environment-jsdom](https://github.com/jestjs/jest/tree/HEAD/packages/jest-environment-jsdom) from 29.7.0 to 30.0.0.
- [Release notes](https://github.com/jestjs/jest/releases)
- [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jestjs/jest/commits/v30.0.0/packages/jest-environment-jsdom)

---
updated-dependencies:
- dependency-name: jest-environment-jsdom
  dependency-version: 30.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-11 00:22:17 +00:00
Alex Janousek
672651f3a6 Merge pull request #2666 from GSA/dependabot/npm_and_yarn/jest-each-30.0.0
Bump jest-each from 29.7.0 to 30.0.0
2025-06-10 20:21:07 -04:00
alexjanousekGSA
888a615d03 Updated gulp task to be more explicit 2025-06-10 20:17:57 -04:00
dependabot[bot]
cf7af35178 Bump gulp from 5.0.0 to 5.0.1
Bumps [gulp](https://github.com/gulpjs/gulp) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/gulpjs/gulp/releases)
- [Changelog](https://github.com/gulpjs/gulp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gulpjs/gulp/compare/v5.0.0...v5.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-11 00:13:31 +00:00
dependabot[bot]
057d703851 Bump jest-each from 29.7.0 to 30.0.0
Bumps [jest-each](https://github.com/jestjs/jest/tree/HEAD/packages/jest-each) from 29.7.0 to 30.0.0.
- [Release notes](https://github.com/jestjs/jest/releases)
- [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jestjs/jest/commits/v30.0.0/packages/jest-each)

---
updated-dependencies:
- dependency-name: jest-each
  dependency-version: 30.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-11 00:13:27 +00:00
Alex Janousek
5b0c739adb Merge pull request #2667 from GSA/dependabot/npm_and_yarn/playwright-1.53.0
Bump playwright from 1.52.0 to 1.53.0
2025-06-10 20:12:31 -04:00
Alex Janousek
6c9e79c7a4 Merge pull request #2669 from GSA/dependabot/npm_and_yarn/jest-30.0.0
Bump jest from 29.7.0 to 30.0.0
2025-06-10 20:12:18 -04:00
Alex Janousek
d53bc5ff38 Merge pull request #2670 from GSA/dependabot/pip/cryptography-45.0.4
Bump cryptography from 45.0.3 to 45.0.4
2025-06-10 20:12:07 -04:00
dependabot[bot]
e8d8bf1eb1 Bump cryptography from 45.0.3 to 45.0.4
Bumps [cryptography](https://github.com/pyca/cryptography) from 45.0.3 to 45.0.4.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/45.0.3...45.0.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-10 23:58:51 +00:00
dependabot[bot]
c60f2eab0d Bump jest from 29.7.0 to 30.0.0
Bumps [jest](https://github.com/jestjs/jest/tree/HEAD/packages/jest) from 29.7.0 to 30.0.0.
- [Release notes](https://github.com/jestjs/jest/releases)
- [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/jestjs/jest/commits/v30.0.0/packages/jest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-10 23:37:28 +00:00
dependabot[bot]
f8f01c99e6 Bump playwright from 1.52.0 to 1.53.0
Bumps [playwright](https://github.com/microsoft/playwright) from 1.52.0 to 1.53.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.52.0...v1.53.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-10 23:36:57 +00:00
Kenneth Kehl
bc4a4bcd33 fix codeql warning 2025-06-10 15:01:18 -07:00
Kenneth Kehl
14a4169525 try pyjwt instead of jwt 2025-06-10 12:07:36 -07:00
Kenneth Kehl
a8bb555703 add jwt 2025-06-10 11:57:47 -07:00
Kenneth Kehl
7ba13c5d0d add poetry.lock 2025-06-10 11:43:19 -07:00
Kenneth Kehl
30093673d0 inline notifications-python-client 2025-06-10 11:40:14 -07:00
dependabot[bot]
81f24f08ef Bump gulp from 5.0.0 to 5.0.1
Bumps [gulp](https://github.com/gulpjs/gulp) from 5.0.0 to 5.0.1.
- [Release notes](https://github.com/gulpjs/gulp/releases)
- [Changelog](https://github.com/gulpjs/gulp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gulpjs/gulp/compare/v5.0.0...v5.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-10 15:50:57 +00:00
ccostino
f4795843cc Merge pull request #2662 from GSA/dependabot/npm_and_yarn/sass-embedded-1.89.2
Bump sass-embedded from 1.89.1 to 1.89.2
2025-06-10 11:49:42 -04:00
ccostino
71d076e32f Merge pull request #2661 from GSA/dependabot/pip/newrelic-10.13.0
Bump newrelic from 10.12.0 to 10.13.0
2025-06-10 11:28:59 -04:00
dependabot[bot]
42aca4ebe7 Bump newrelic from 10.12.0 to 10.13.0
Bumps [newrelic](https://github.com/newrelic/newrelic-python-agent) from 10.12.0 to 10.13.0.
- [Release notes](https://github.com/newrelic/newrelic-python-agent/releases)
- [Commits](https://github.com/newrelic/newrelic-python-agent/compare/v10.12.0...v10.13.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-10 14:49:53 +00:00
dependabot[bot]
9815c9ec9f Bump sass-embedded from 1.89.1 to 1.89.2
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.89.1 to 1.89.2.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.89.1...1.89.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-10 14:49:29 +00:00
ccostino
6df7f3f926 Merge pull request #2660 from GSA/dependabot/pip/phonenumbers-9.0.7
Bump phonenumbers from 9.0.6 to 9.0.7
2025-06-10 10:32:47 -04:00
ccostino
6970f2f981 Merge pull request #2652 from GSA/dependabot/npm_and_yarn/rollup-4.42.0
Bump rollup from 4.41.1 to 4.42.0
2025-06-10 09:50:29 -04:00
Beverly Nguyen
3156d5e7ae Merge branch 'main' into 2253-bug-on-template-page 2025-06-09 18:01:31 -07:00
Beverly Nguyen
312cdf08fa added no results found and no live search on /template page 2025-06-09 17:58:43 -07:00
Beverly Nguyen
fa158cd762 - Clears any selected checkboxes to prevent form submission issues
- Fix search functionality to respect .template-list-item-hidden-by-default
- Add missing "No templates found" message to template search
- Ensure nested template items remain hidden when searching and clearing search
- Hides all template items when clicking "New template" button
- Shows everything again when exiting the "new template" state
2025-06-09 16:35:01 -07:00
dependabot[bot]
1b4c4350ce Bump phonenumbers from 9.0.6 to 9.0.7
Bumps [phonenumbers](https://github.com/daviddrysdale/python-phonenumbers) from 9.0.6 to 9.0.7.
- [Commits](https://github.com/daviddrysdale/python-phonenumbers/compare/v9.0.6...v9.0.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-09 23:22:45 +00:00
ccostino
63abd500b6 Merge pull request #2658 from GSA/python_manual_unwind
remove asyncio-mode=auto
2025-06-09 16:24:16 -04:00
Kenneth Kehl
31c58e0be7 remove asyncio-mode=auto 2025-06-09 13:14:46 -07:00
ccostino
37fee05bfb Merge pull request #2657 from GSA/python_manual_unwind
try to solve async issues
2025-06-09 16:02:17 -04:00
Kenneth Kehl
86f8d66573 commit out offending tests 2025-06-09 12:37:20 -07:00
Kenneth Kehl
7b6a6ffe53 commit out offending tests 2025-06-09 12:28:08 -07:00
Kenneth Kehl
396459be67 try to solve async issues 2025-06-09 12:18:38 -07:00
Kenneth Kehl
a2fab31653 try to solve async issues 2025-06-09 12:15:54 -07:00
Kenneth Kehl
1e95628c56 try to solve async issues 2025-06-09 12:08:10 -07:00
Kenneth Kehl
3672b16315 try to solve async issues 2025-06-09 11:59:32 -07:00
ccostino
f290ae30a7 Merge pull request #2656 from GSA/python_manual_unwind
remove async
2025-06-09 14:36:32 -04:00
Kenneth Kehl
e5dc5f12aa mix and match asyncs to try to get things passing 2025-06-09 11:02:01 -07:00
Kenneth Kehl
12b8dd6c4f remove async 2025-06-09 10:55:26 -07:00
Kenneth Kehl
36c7781e37 remove async 2025-06-09 10:47:37 -07:00
ccostino
1daccc812c Merge pull request #2655 from GSA/python_manual_unwind
manually roll python back to 3.12.2
2025-06-09 13:28:46 -04:00
Kenneth Kehl
19b0e24602 uncomment tests 2025-06-09 10:07:04 -07:00
Kenneth Kehl
71b865cc12 uncomment tests 2025-06-09 09:34:13 -07:00
Kenneth Kehl
526402a7f4 revert api health changes 2025-06-09 09:17:12 -07:00
Kenneth Kehl
a5399ae693 manually roll python back to 3.12.2 2025-06-09 08:59:50 -07:00
dependabot[bot]
e84750fbbf Bump rollup from 4.41.1 to 4.42.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.41.1 to 4.42.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.41.1...v4.42.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-06 23:59:27 +00:00
ccostino
6d0bd1cfca Merge pull request #2651 from GSA/disable_strict
fix api health
2025-06-06 16:01:23 -04:00
Kenneth Kehl
a9ff570a53 fix api health 2025-06-06 11:29:37 -07:00
Kenneth Kehl
9c55f5035c fix api health 2025-06-06 11:22:29 -07:00
Kenneth Kehl
3c63a345c9 fix api health 2025-06-06 11:18:47 -07:00
Kenneth Kehl
c5613954a0 fix api health 2025-06-06 11:03:43 -07:00
Kenneth Kehl
87489c8e55 fix api health 2025-06-06 10:54:25 -07:00
Kenneth Kehl
8c1c9e877d fix api health 2025-06-06 10:47:38 -07:00
ccostino
8232d4ca21 Merge pull request #2650 from GSA/add-cert-env-var
Add one more cert environment variable
2025-06-05 17:51:35 -04:00
Carlo Costino
229f8467c8 Add one more cert environment variable
This changeset adds an additional environment variable to enforce usage of the correct CA certificate in case any libraries override it.

Please see https://cloud.gov/docs/management/container-to-container/#addressing-certificate-validation-errors for more details.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-06-05 17:43:10 -04:00
ccostino
47571bc342 Merge pull request #2646 from GSA/eventlet_huh
add some debug for certificate issue
2025-06-05 13:39:36 -04:00
Kenneth Kehl
9f6e449b5e whoops, put test back 2025-06-05 10:01:57 -07:00
Kenneth Kehl
7942e02747 comment out async tests 2025-06-05 09:01:26 -07:00
Kenneth Kehl
f9b96e9f83 merge 2025-06-05 08:49:11 -07:00
Kenneth Kehl
b3736b03b1 add debug 2025-06-05 08:48:21 -07:00
Carlo Costino
00832b9555 Updating pytest to account for the async test errors
Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-06-04 16:16:45 -04:00
Cathy Beil
2926da155e Add files via upload
Small updates.
2025-06-04 14:59:39 -05:00
Kenneth Kehl
9430bbd97e fix format 2025-06-04 11:49:55 -07:00
Kenneth Kehl
8b3cb14666 more asyncio 2025-06-04 11:42:49 -07:00
Kenneth Kehl
0d8f1e9c01 ugh 2025-06-04 11:31:19 -07:00
Kenneth Kehl
56980e04ce try pytest-asyncio again 2025-06-04 11:22:28 -07:00
Kenneth Kehl
b990363436 comment out offending test 2025-06-04 11:02:08 -07:00
Kenneth Kehl
1981c02207 try adding pytest-asyncio 2025-06-04 10:45:38 -07:00
Kenneth Kehl
09cf2098af add poetry.lock 2025-06-04 10:34:56 -07:00
Kenneth Kehl
4cd727ab51 get rid of async 2025-06-04 10:31:13 -07:00
Kenneth Kehl
15501fb6ce test removing eventlet 0.40.0 2025-06-04 10:16:43 -07:00
Carlo Costino
595ae759d1 Unpin egress proxy release and eventlet dependency
This changeset unpins the egress proxy release now that we have resolved the other issues surrounding the connectivity to S3.  It also makes sure the eventlet dependency is up-to-date.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-06-04 12:12:29 -04:00
Beverly Nguyen
5053d5d440 updated bg color 2025-06-03 15:44:55 -07:00
Beverly Nguyen
55a86bcebc updated content 2025-06-03 15:33:10 -07:00
Cathy Beil
91b83ab749 Add files via upload 2025-06-03 14:29:17 -05:00
ccostino
9042f58e2c Merge pull request #2631 from GSA/pythonupgrade
python upgrade to 3.13.2
2025-06-03 14:54:05 -04:00
ccostino
cf6c402e66 Merge pull request #2642 from GSA/dependabot/npm_and_yarn/sass-embedded-1.89.1
Bump sass-embedded from 1.89.0 to 1.89.1
2025-06-03 11:00:01 -04:00
ccostino
09f1c712bb Merge pull request #2644 from GSA/dependabot/npm_and_yarn/tar-fs-3.0.9
Bump tar-fs from 3.0.8 to 3.0.9
2025-06-03 08:52:47 -04:00
dependabot[bot]
f2b53628df Bump tar-fs from 3.0.8 to 3.0.9
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 3.0.8 to 3.0.9.
- [Commits](https://github.com/mafintosh/tar-fs/compare/v3.0.8...v3.0.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-03 06:57:16 +00:00
dependabot[bot]
f1b31eb85e Bump sass-embedded from 1.89.0 to 1.89.1
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.89.0 to 1.89.1.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.89.0...1.89.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-02 23:54:10 +00:00
Beverly Nguyen
3e5c194a11 fix test 2025-06-02 13:21:37 -07:00
Beverly Nguyen
65d13701c7 remove nav before login 2025-06-02 13:10:00 -07:00
Beverly Nguyen
8722ae8dd9 - Replace homepage content with sunset messaging for May 30, 2025 service end
- Convert inline SVGs to external files for better maintainability
-Removed Login buttons except for /sign-in page
-Removed header navs
2025-06-02 12:56:47 -07:00
Cathy Beil
33ab578d1f Add files via upload
Updated version.
2025-06-02 13:04:13 -05:00
ccostino
8ca029ea4d Merge pull request #2635 from GSA/dependabot/npm_and_yarn/babel/core-7.27.4
Bump @babel/core from 7.27.3 to 7.27.4
2025-06-02 08:33:23 -04:00
dependabot[bot]
9d737e35d7 Bump @babel/core from 7.27.3 to 7.27.4
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.27.3 to 7.27.4.
- [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.4/packages/babel-core)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-30 23:50:39 +00:00
Cathy Beil
702c8c369e Add files via upload
Adding the story to our pdf repository
2025-05-30 16:42:30 -05:00
Cathy Beil
b81c6b20ec Add files via upload
Adding Text Campaign Planning pdf.
2025-05-30 16:14:08 -05:00
Kenneth Kehl
7dfe9c5988 merge from main 2025-05-30 13:30:51 -07:00
Kenneth Kehl
4cbcf3fe27 python upgrade 2025-05-30 10:09:40 -07:00
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
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
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
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
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
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
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
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
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
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
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
Jonathan Bobel
06c238269f Update send.html
Fixing the back link
2025-04-01 11:02:08 -04: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
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
Jonathan Bobel
d79ece2d01 2138 - Change cancel button to uploading button for CSV 2025-03-26 14:49:11 -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
199 changed files with 8481 additions and 4339 deletions

View File

@@ -127,6 +127,16 @@
}
],
"results": {
".github/workflows/checks.yml": [
{
"type": "Secret Keyword",
"filename": ".github/workflows/checks.yml",
"hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8",
"is_verified": false,
"line_number": 68,
"is_secret": false
}
],
"app/assets/js/uswds.min.js": [
{
"type": "Secret Keyword",
@@ -151,7 +161,7 @@
"filename": "app/config.py",
"hashed_secret": "577a4c667e4af8682ca431857214b3a920883efc",
"is_verified": false,
"line_number": 120,
"line_number": 123,
"is_secret": false
}
],
@@ -389,26 +399,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",
@@ -479,7 +469,7 @@
"filename": "tests/app/main/test_errorhandlers.py",
"hashed_secret": "005fa73b3f2be8f0d71d361c1f0a9d787cd09b4e",
"is_verified": false,
"line_number": 33,
"line_number": 34,
"is_secret": false
}
],
@@ -537,7 +527,7 @@
"filename": "tests/app/main/views/test_register.py",
"hashed_secret": "bdbb156d25d02fd7792865824201dda1c60f4473",
"is_verified": false,
"line_number": 122,
"line_number": 114,
"is_secret": false
},
{
@@ -545,7 +535,7 @@
"filename": "tests/app/main/views/test_register.py",
"hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8",
"is_verified": false,
"line_number": 199,
"line_number": 184,
"is_secret": false
},
{
@@ -553,7 +543,7 @@
"filename": "tests/app/main/views/test_register.py",
"hashed_secret": "bb5b7caa27d005d38039e3797c3ddb9bcd22c3c8",
"is_verified": false,
"line_number": 272,
"line_number": 255,
"is_secret": false
}
],
@@ -563,7 +553,7 @@
"filename": "tests/app/main/views/test_sign_in.py",
"hashed_secret": "8b8b69116ee882b5e987e330f55db81aba0636f9",
"is_verified": false,
"line_number": 97,
"line_number": 95,
"is_secret": false
}
],
@@ -642,37 +632,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-04-10T19:38:31Z"
"generated_at": "2025-06-18T17:05:12Z"
}

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

@@ -9,13 +9,19 @@ runs:
sudo apt-get update \
&& sudo apt-get install -y --no-install-recommends \
libcurl4-openssl-dev
- name: Set up Python 3.12.3
- name: Set up Python 3.12.9
uses: actions/setup-python@v4
with:
python-version: "3.12.3"
python-version: "3.12.9"
- 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

@@ -51,74 +51,73 @@ jobs:
- name: Check coverage threshold
run: poetry run coverage report --fail-under=90
# TODO FIX THIS!
# end-to-end-tests:
# if: ${{ github.actor != 'dependabot[bot]' }}
end-to-end-tests:
if: ${{ github.actor != 'dependabot[bot]' }}
# permissions:
# checks: write
# pull-requests: write
# contents: write
# runs-on: ubuntu-latest
# environment: staging
# services:
# postgres:
# image: postgres
# env:
# POSTGRES_USER: user
# POSTGRES_PASSWORD: password
# POSTGRES_DB: test_notification_api
# options: >-
# --health-cmd pg_isready
# --health-interval 10s
# --health-timeout 5s
# --health-retries 5
# ports:
# # Maps tcp port 5432 on service container to the host
# - 5432:5432
# redis:
# image: redis
# options: >-
# --health-cmd "redis-cli ping"
# --health-interval 10s
# --health-timeout 5s
# --health-retries 5
# ports:
# # Maps tcp port 6379 on service container to the host
# - 6379:6379
permissions:
checks: write
pull-requests: write
contents: write
runs-on: ubuntu-latest
environment: staging
services:
postgres:
image: postgres
env:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: test_notification_api
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps tcp port 5432 on service container to the host
- 5432:5432
redis:
image: redis
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
# Maps tcp port 6379 on service container to the host
- 6379:6379
# steps:
# - uses: actions/checkout@v4
# - uses: ./.github/actions/setup-project
# - uses: jwalton/gh-find-current-pr@v1
# id: findPr
# - name: Check API Server availability
# run: |
# curl --fail -v https://notify-api-staging.app.cloud.gov || exit 1
# - name: Run Admin server
# # If we want to log stuff and see what's broken,
# # insert this line:
# # tail -f admin-server.log &
# # above make e2e-test
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-project
- uses: jwalton/gh-find-current-pr@v1
id: findPr
- name: Check API Server availability
run: |
curl --fail -v https://notify-api-staging.app.cloud.gov || exit 1
- name: Run Admin server
# If we want to log stuff and see what's broken,
# insert this line:
# tail -f admin-server.log &
# above make e2e-test
# run: |
# make run-flask > admin-server.log 2>&1 &
# tail -f admin-server.log &
# make e2e-test
run: |
make run-flask > admin-server.log 2>&1 &
tail -f admin-server.log &
make e2e-test
# env:
# API_HOST_NAME: https://notify-api-staging.app.cloud.gov/
# SECRET_KEY: ${{ secrets.SECRET_KEY }}
# DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
# ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
# ADMIN_CLIENT_USERNAME: notify-admin
# NOTIFY_ENVIRONMENT: e2etest
# NOTIFY_E2E_AUTH_STATE_PATH: ${{ secrets.NOTIFY_E2E_AUTH_STATE_PATH }}
# NOTIFY_E2E_TEST_EMAIL: ${{ secrets.NOTIFY_E2E_TEST_EMAIL }}
# NOTIFY_E2E_TEST_PASSWORD: ${{ secrets.NOTIFY_E2E_TEST_PASSWORD }}
# NOTIFY_E2E_TEST_URI: http://localhost:6012/
# VCAP_SERVICES: ${{ secrets.VCAP_SERVICES }}
env:
API_HOST_NAME: https://notify-api-staging.app.cloud.gov/
SECRET_KEY: ${{ secrets.SECRET_KEY }}
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
ADMIN_CLIENT_USERNAME: notify-admin
NOTIFY_ENVIRONMENT: e2etest
NOTIFY_E2E_AUTH_STATE_PATH: ${{ secrets.NOTIFY_E2E_AUTH_STATE_PATH }}
NOTIFY_E2E_TEST_EMAIL: ${{ secrets.NOTIFY_E2E_TEST_EMAIL }}
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
@@ -140,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

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

@@ -42,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
@@ -63,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 }}
@@ -87,6 +89,8 @@ 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: Deploy egress proxy

View File

@@ -42,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
@@ -63,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 }}
@@ -87,6 +89,8 @@ 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: Deploy egress proxy

View File

@@ -47,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
@@ -69,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 }}
@@ -93,6 +95,8 @@ 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

View File

@@ -24,14 +24,26 @@ jobs:
terraform_wrapper: false
- name: Check for drift
uses: dflook/terraform-check@v1
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
TF_VAR_cf_user: ${{ secrets.CLOUDGOV_USERNAME }}
TF_VAR_cf_password: ${{ secrets.CLOUDGOV_PASSWORD }}
with:
path: terraform/staging
run: |
cd terraform/staging
terraform init
terraform plan -detailed-exitcode
exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "No changes detected. Intrastructure is up-to-date."
elif [ $exit_code -eq 2 ]; then
echo "Changes detected. Infrastructure drift found."
exit 1
else
echo "Error running terraform plan."
exit $exit_code
fi
check_demo_drift:
runs-on: ubuntu-latest
@@ -52,14 +64,25 @@ jobs:
terraform_wrapper: false
- name: Check for drift
uses: dflook/terraform-check@v1
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
TF_VAR_cf_user: ${{ secrets.CLOUDGOV_USERNAME }}
TF_VAR_cf_password: ${{ secrets.CLOUDGOV_PASSWORD }}
with:
path: terraform/demo
run: |
cd terraform/demo
terraform init
terraform plan -detailed-exitcode
exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "No changes detected. Intrastructure is up-to-date."
elif [ $exit_code -eq 2 ]; then
echo "Changes detected. Infrastructure drift found."
exit 1
else
echo "Error running terraform plan."
exit $exit_code
fi
check_prod_drift:
runs-on: ubuntu-latest
@@ -80,11 +103,22 @@ jobs:
terraform_wrapper: false
- name: Check for drift
uses: dflook/terraform-check@v1
env:
AWS_ACCESS_KEY_ID: ${{ secrets.TERRAFORM_STATE_ACCESS_KEY }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.TERRAFORM_STATE_SECRET_ACCESS_KEY }}
TF_VAR_cf_user: ${{ secrets.CLOUDGOV_USERNAME }}
TF_VAR_cf_password: ${{ secrets.CLOUDGOV_PASSWORD }}
with:
path: terraform/production
run: |
cd terraform/production
terraform init
terraform plan -detailed-exitcode
exit_code=$?
if [ $exit_code -eq 0 ]; then
echo "No changes detected. Intrastructure is up-to-date."
elif [ $exit_code -eq 2 ]; then
echo "Changes detected. Infrastructure drift found."
exit 1
else
echo "Error running terraform plan."
exit $exit_code
fi

1
.gitignore vendored
View File

@@ -14,6 +14,7 @@
*.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

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

@@ -17,9 +17,7 @@ NVMSH := $(shell [ -f "$(HOME)/.nvm/nvm.sh" ] && echo "$(HOME)/.nvm/nvm.sh" || e
.PHONY: bootstrap
bootstrap: ## Set up everything to run the app
make generate-version-file
poetry self add poetry-dotenv-plugin
poetry lock --no-update
poetry install --sync --no-root
poetry sync --no-root
poetry run playwright install --with-deps
poetry run pre-commit install
source $(NVMSH) --no-use && nvm install && npm install
@@ -29,9 +27,7 @@ bootstrap: ## Set up everything to run the app
.PHONY: bootstrap-with-git-hooks
bootstrap-with-git-hooks: ## Sets everything up and accounts for pre-existing git hooks
make generate-version-file
poetry self add poetry-dotenv-plugin
poetry lock --no-update
poetry install --sync --no-root
poetry sync --no-root
poetry run playwright install --with-deps
git config --global --unset-all core.hooksPath
poetry run pre-commit install
@@ -106,11 +102,11 @@ py-test: ## Run python unit tests
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
@@ -131,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.
@@ -243,12 +243,12 @@ git clone git@github.com:GSA/notifications-admin.git
Now go into the project directory (`notifications-admin` by default), create a
virtual environment, and set the local Python version to point to the virtual
environment (assumes version Python `3.12.2` is what is installed on your
environment (assumes version Python `3.12.9` is what is installed on your
machine):
```sh
cd notifications-admin
pyenv virtualenv 3.12.2 notify-admin
pyenv virtualenv 3.12.9 notify-admin
pyenv local notify-admin
```
@@ -299,7 +299,7 @@ environment with the newer version of Python you just installed:
```sh
cd notifications-admin
pyenv virtualenv 3.12.2 notify-admin
pyenv virtualenv 3.12.9 notify-admin
pyenv local notify-admin
```
@@ -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

@@ -24,7 +24,6 @@ from flask_talisman import Talisman
from flask_wtf import CSRFProtect
from flask_wtf.csrf import CSRFError
from itsdangerous import BadSignature
from notifications_python_client.errors import HTTPError
from werkzeug.exceptions import HTTPException as WerkzeugHTTPException
from werkzeug.exceptions import abort
from werkzeug.local import LocalProxy
@@ -35,6 +34,7 @@ from app.config import configs
from app.extensions import redis_client
from app.formatters import (
convert_markdown_template,
convert_time_unixtimestamp,
convert_to_boolean,
format_auth_type,
format_billions,
@@ -109,7 +109,9 @@ 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_python_client.errors import HTTPError
from notifications_utils import logging, request_helper
from notifications_utils.formatters import (
formatted_list,
@@ -140,6 +142,9 @@ 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": [
@@ -164,8 +169,8 @@ def _csp(config):
"'self'",
"https://gov-bam.nr-data.net",
"https://www.google-analytics.com",
"http://localhost:6011",
"ws://localhost:6011",
f"{api_public_url}",
f"{api_public_ws_url}",
],
"style-src": ["'self'", asset_domain],
"img-src": ["'self'", asset_domain, logo_domain],
@@ -189,6 +194,10 @@ def create_app(application):
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
@@ -664,6 +673,7 @@ def add_template_filters(application):
format_thousands,
id_safe,
convert_to_boolean,
convert_time_unixtimestamp,
format_list_items,
iteration_count,
recipient_count,

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

@@ -0,0 +1,17 @@
<svg width="305" height="304" viewBox="0 0 381 380" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M163.41 47.1289H32.7852C14.983 47.1289 0.5 61.6119 0.5 79.414V293.793C0.755313 301.164 11.3797 301.158 11.6328 293.793V79.414C11.6328 67.7506 21.1217 58.2617 32.7852 58.2617H163.41C175.074 58.2617 184.562 67.7506 184.562 79.414V335.84H11.6328V319.851C11.3775 312.481 0.753086 312.487 0.5 319.851V346.601C0.5 364.403 14.983 378.887 32.7852 378.887H163.41C181.212 378.887 195.695 364.403 195.695 346.601V79.414C195.695 61.6119 181.212 47.1289 163.41 47.1289ZM163.41 367.754H32.7852C21.2464 367.754 11.8414 358.464 11.6425 346.972H184.554C184.354 358.464 174.949 367.754 163.41 367.754Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M72.8629 102.793H123.332C145.461 101.951 145.444 70.2287 123.332 69.3945H72.8629C50.7338 70.2362 50.7509 101.959 72.8629 102.793ZM72.8629 80.5273H123.332C130.701 80.7893 130.696 91.4004 123.332 91.6601H72.8629C65.4937 91.3981 65.4989 80.7871 72.8629 80.5273Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M41.6899 265.26V303.853C41.6899 308.56 45.5189 312.389 50.2251 312.389H145.225C149.931 312.389 153.76 308.56 153.76 303.853V265.26C153.76 260.554 149.931 256.725 145.225 256.725H50.2251C45.5181 256.725 41.6899 260.554 41.6899 265.26ZM52.8228 267.857H142.627V301.256H52.8228V267.857Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M374.934 50.0976C378.008 50.0976 380.5 47.6054 380.5 44.5312V21.4203C380.5 9.60909 370.835 0 358.955 0H258.626C246.746 0 237.081 9.60909 237.081 21.4203V99.174L211.672 116.104C207.446 118.746 207.447 125.434 211.673 128.076L237.081 145.005V195.298C237.081 207.109 246.746 216.718 258.626 216.718H358.955C370.835 216.719 380.5 207.109 380.5 195.298V71.9098C380.245 64.5391 369.62 64.545 369.367 71.9098V195.298C369.367 200.971 364.697 205.586 358.955 205.586H258.626C252.885 205.586 248.214 200.971 248.214 195.298V143.773C248.214 140.812 246.74 138.063 244.272 136.418L222.766 122.09L244.272 107.761C246.741 106.116 248.214 103.367 248.214 100.407V21.4203C248.214 15.7477 252.885 11.1328 258.626 11.1328H358.955C364.697 11.1328 369.367 15.7477 369.367 21.4203V44.5312C369.367 47.6054 371.86 50.0976 374.934 50.0976Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M279.025 44.4072H313.172C320.542 44.1519 320.537 33.5275 313.172 33.2744H279.025C271.655 33.5305 271.66 44.1549 279.025 44.4072Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M279.025 116.647H313.172C320.542 116.392 320.537 105.768 313.172 105.515H279.025C271.655 105.77 271.66 116.394 279.025 116.647Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M279.025 62.4678H336.689C344.059 62.2125 344.054 51.588 336.689 51.335H279.025C271.655 51.5903 271.66 62.2147 279.025 62.4678Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M279.025 80.5273H336.689C344.059 80.272 344.054 69.6476 336.689 69.3945H279.025C271.655 69.6498 271.66 80.2743 279.025 80.5273Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M98.0967 205.319C108.123 205.319 116.28 197.161 116.28 187.135C115.366 163.045 80.8237 163.052 79.9131 187.135C79.9131 197.161 88.0705 205.319 98.0967 205.319ZM98.0967 180.084C101.984 180.084 105.147 183.248 105.147 187.135C104.793 196.476 91.3992 196.473 91.0459 187.135C91.0459 183.247 94.2091 180.084 98.0967 180.084Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M49.0186 181.389C49.7927 183.69 51.1932 185.667 53.0569 187.135C51.1932 188.603 49.7935 190.58 49.0186 192.88C47.9662 196.005 48.1948 199.354 49.6621 202.308L56.7158 216.509C59.7425 222.603 67.1644 225.101 73.2592 222.078L77.814 219.82V224.885C77.814 231.693 83.3529 237.233 90.1618 237.233H106.039C112.844 237.233 118.38 231.697 118.38 224.891V219.82L122.935 222.078C129.032 225.101 136.452 222.603 139.479 216.509L146.533 202.305C148 199.352 148.229 196.004 147.177 192.879C146.403 190.578 145.001 188.601 143.138 187.134C147.636 183.694 149.157 177.013 146.532 171.96L139.48 157.763C136.453 151.668 129.029 149.168 122.932 152.192L118.38 154.449V149.378C118.38 142.573 112.844 137.036 106.039 137.036H90.1618C83.3537 137.036 77.814 142.575 77.814 149.384V154.449L73.2622 152.192C67.1651 149.168 59.7417 151.667 56.7144 157.762L49.6621 171.96C48.1948 174.916 47.9662 178.264 49.0186 181.389ZM59.6319 176.914L66.6842 162.717C66.9825 162.115 67.7151 161.867 68.3162 162.167L78.764 167.347C80.9646 168.437 83.5259 168.316 85.6129 167.021C87.7007 165.726 88.9468 163.486 88.9468 161.03V149.385C88.9468 148.715 89.4916 148.17 90.1618 148.17H106.039C106.705 148.17 107.247 148.712 107.247 149.379V161.03C107.247 163.486 108.493 165.726 110.581 167.021C112.668 168.316 115.228 168.439 117.43 167.346L127.878 162.166C128.48 161.868 129.211 162.115 129.51 162.716L136.563 176.913C136.747 177.284 136.698 177.62 136.626 177.836C136.553 178.053 136.388 178.349 136.016 178.533L131.411 180.817C126.23 183.267 126.231 191.002 131.411 193.451L136.019 195.736C136.39 195.92 136.554 196.215 136.626 196.431C136.699 196.647 136.747 196.982 136.563 197.351L129.509 211.555C129.211 212.154 128.48 212.401 127.881 212.103L117.43 206.921C115.229 205.83 112.668 205.952 110.582 207.247C108.494 208.542 107.248 210.782 107.248 213.239V224.89C107.248 225.556 106.706 226.099 106.039 226.099H90.1625C89.4931 226.099 88.9476 225.554 88.9476 224.884V213.239C88.9476 210.782 87.7014 208.542 85.6137 207.247C83.5229 205.95 80.9601 205.832 78.764 206.922L68.3133 212.104C67.7121 212.401 66.9833 212.155 66.6864 211.556L59.6326 197.356C59.4486 196.985 59.4968 196.649 59.5696 196.432C59.6423 196.215 59.807 195.919 60.1781 195.735L64.7842 193.451C69.9654 191.001 69.9639 183.266 64.7842 180.818L60.1789 178.534C59.8078 178.35 59.643 178.053 59.5703 177.837C59.4968 177.62 59.4486 177.285 59.6319 176.914Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M363.426 257.783H235.796C226.382 257.783 218.723 265.442 218.723 274.856V362.927C218.723 372.341 226.383 380 235.796 380H363.426C372.841 380 380.499 372.341 380.499 362.927V274.856C380.499 265.442 372.841 257.783 363.426 257.783ZM369.366 362.927C369.366 366.203 366.702 368.867 363.426 368.867H235.796C232.52 368.867 229.856 366.203 229.856 362.927V274.856C229.856 271.58 232.521 268.916 235.796 268.916H363.426C366.702 268.916 369.366 271.58 369.366 274.856V362.927Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M268.272 141.779V181.381C268.272 185.809 271.875 189.412 276.304 189.412H340.926C345.354 189.412 348.956 185.809 348.956 181.381V141.779C348.956 137.351 345.354 133.749 340.926 133.749H276.304C271.875 133.748 268.272 137.35 268.272 141.779ZM279.405 144.881H337.824V178.279H279.405V144.881Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M273.174 297.591C271.206 295.229 267.695 294.909 265.334 296.878L241.975 316.344C239.33 318.441 239.331 322.8 241.975 324.897L265.334 344.364C266.375 345.23 267.638 345.654 268.895 345.653C270.489 345.653 272.073 344.971 273.174 343.65C275.142 341.289 274.823 337.779 272.462 335.811L254.233 320.62L272.462 305.431C274.823 303.462 275.142 299.953 273.174 297.591Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M357.249 316.344L333.889 296.878C331.527 294.91 328.018 295.229 326.049 297.59C324.081 299.952 324.4 303.462 326.762 305.43L344.99 320.62L326.762 335.81C324.4 337.778 324.081 341.288 326.049 343.65C328.026 346.021 331.541 346.322 333.889 344.362L357.249 324.895C359.893 322.799 359.892 318.441 357.249 316.344Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
<path d="M314.73 284.336C311.892 283.154 308.634 284.495 307.451 287.333L281.496 349.626C280.314 352.464 281.656 355.723 284.493 356.905C287.26 358.079 290.59 356.775 291.772 353.908L317.727 291.616C318.91 288.778 317.569 285.519 314.73 284.336Z" fill="#005EA2" stroke="#DFE1E2" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

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

@@ -63,7 +63,7 @@
const buttonContent = this.buttonContent[buttonState](this.fieldLabel);
const stickyClass = expanded ? ' js-stick-at-bottom-when-scrolling' : '';
return $(`<div class="selection-footer${stickyClass}">
return $(`<div class="selection-footer${stickyClass} margin-top-2">
<button
class="govuk-button govuk-button--secondary selection-footer__button usa-button usa-button--outline"
aria-expanded="${expanded ? 'true' : 'false'}"
@@ -78,8 +78,6 @@
this.module.$formGroup.append(this.$el);
// make footer sticky if expanded, clear up from it being sticky if not
GOVUK.stickAtBottomWhenScrolling.recalculate();
};
function CollapsibleCheckboxes () {}
@@ -97,6 +95,7 @@
this.total = this.$checkboxes.length;
this.legendText = this.$fieldset.find('legend').first().text().trim();
this.expanded = false;
this.checkUncheckButtonsAdded = false;
this.addHeadingHideLegend();
@@ -124,6 +123,44 @@
this.$fieldset.find('legend').addClass('usa-sr-only');
};
CollapsibleCheckboxes.prototype.addCheckUncheckAllButtons = function() {
const $buttonsContainer = $('<div class="check-uncheck-all-buttons margin-bottom-2"></div>');
this.$toggleAllButton = $('<button type="button" class="usa-button usa-button--outline usa-button--small">Select all</button>');
$buttonsContainer.append(this.$toggleAllButton);
this.summary.$el.after($buttonsContainer);
this.$toggleAllButton.on('click', this.toggleAll.bind(this));
this.updateToggleButtonText();
};
CollapsibleCheckboxes.prototype.toggleAll = function(e) {
e.preventDefault();
const allChecked = this.$checkboxes.filter(':checked').length === this.$checkboxes.length;
if (allChecked) {
this.$checkboxes.prop('checked', false);
} else {
this.$checkboxes.prop('checked', true);
}
this.handleSelection();
this.updateToggleButtonText();
};
CollapsibleCheckboxes.prototype.updateToggleButtonText = function() {
if (!this.$toggleAllButton) return;
const checkedCount = this.$checkboxes.filter(':checked').length;
const allChecked = checkedCount === this.$checkboxes.length;
if (allChecked) {
this.$toggleAllButton.text('Deselect all');
} else {
this.$toggleAllButton.text('Select all');
}
};
CollapsibleCheckboxes.prototype.expand = function(e) {
if (e !== undefined) { e.preventDefault(); }
@@ -132,6 +169,15 @@
this.expanded = true;
this.summary.update(this.getSelection());
this.footer.update(this.expanded);
if (!this.checkUncheckButtonsAdded) {
this.addCheckUncheckAllButtons();
this.checkUncheckButtonsAdded = true;
} else {
if (this.$toggleAllButton) {
this.$toggleAllButton.parent().show();
}
}
}
// shift focus whether expanded or not
@@ -145,6 +191,10 @@
this.expanded = false;
this.summary.update(this.getSelection());
this.footer.update(this.expanded);
if (this.$toggleAllButton) {
this.$toggleAllButton.parent().hide();
}
}
// shift focus whether expanded or not
@@ -159,6 +209,7 @@
};
CollapsibleCheckboxes.prototype.handleSelection = function(e) {
this.summary.update(this.getSelection(), this.total, this.fieldLabel);
this.updateToggleButtonText();
};
CollapsibleCheckboxes.prototype.bindEvents = function() {
const self = this;

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,11 +15,11 @@
let query = normalize($searchBox.val());
let results = 0;
let $noResultsMessage = $('.js-live-search-no-results');
$targets.each(function() {
let content = $('.live-search-relevant', this).text() || $(this).text();
let isMatch = normalize(content).indexOf(normalize(query)) > -1;
if ($(this).has(':checked').length) {
$(this).show();
@@ -28,17 +28,27 @@
}
if (query == '') {
$(this).css('display', '');
$(this).removeClass('js-hidden');
results++;
return;
}
$(this).toggle(isMatch);
if (isMatch) { results++; }
let isMatch = normalize(content).includes(normalize(query));
if (isMatch) {
$(this).removeClass('js-hidden');
results++;
} else {
$(this).addClass('js-hidden');
}
});
if (query !== '' && results === 0) {
$noResultsMessage.removeClass('js-hidden');
} else {
$noResultsMessage.addClass('js-hidden');
}
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,37 +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();
return;
}
} else {
$submitButton.data('clicked', 'true');
$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);
if ($submitButton.is('[name="Send"], [name="Schedule"]')) {
$submitButton.prop('disabled', true);
setTimeout(() => {
renableSubmitButton($submitButton);
}, 10000);
} else {
setTimeout(renableSubmitButton($submitButton), 1500);
// 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

@@ -20,6 +20,14 @@ document.addEventListener('DOMContentLoaded', function () {
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}` });
});

View File

@@ -197,6 +197,11 @@
if (event.currentTarget.value === 'add-new-template' && this.$singleNotificationChannel) {
window.location = "/services/" + this.$singleChannelService + "/templates/add-" + this.$singleNotificationChannel;
} else {
if (this.currentState === 'add-new-template') {
this.$form.find('input[type=checkbox]').prop('checked', false);
this.selectionStatus.update({ total: 0, templates: 0, folders: 0 });
}
if (this.stateChanged()) {
this.render();
}
@@ -286,7 +291,29 @@
mode = 'dialog';
}
if (currentStateObj && ('setFocus' in currentStateObj)) {
if (this.currentState === 'add-new-template') {
this.$form.find('.template-list-item').addClass('js-hidden');
$('.live-search').addClass('js-hidden');
$('#breadcrumb-template-folders').addClass('js-hidden');
$('#template-list').addClass('js-hidden');
this.$form.find('input[type=checkbox]').prop('checked', false);
this.selectionStatus.update({ total: 0, templates: 0, folders: 0 });
$('#page-title').text('New Template');
$('#page-description').text('Every message starts with a template. Choose to start with a blank template or copy an existing template.');
document.title = 'New Templates';
} else {
this.$form.find('.template-list-item').removeClass('js-hidden');
$('.live-search').removeClass('js-hidden');
$('#breadcrumb-template-folders').removeClass('js-hidden');
$('#template-list').removeClass('js-hidden');
$('#page-title').text('Select or create a template');
$('#page-description').text('Every message starts with a template. To send, choose or create a template.');
document.title = 'Select or create a template';
}
if (currentStateObj && 'setFocus' in currentStateObj) {
scrollTop = $(window).scrollTop();
currentStateObj.setFocus();
$(window).scrollTop(scrollTop);

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.

Binary file not shown.

View File

@@ -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

@@ -179,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;
@@ -199,7 +208,6 @@ td.table-empty-message {
}
.hint {
display: block;
font-size: size('body', 'sm');
font-weight: normal;
}
@@ -221,6 +229,10 @@ td.table-empty-message {
display: none;
}
.js-hidden {
display: none !important;
}
.folder-heading a.folder-heading-folder,
.template-list-folder {
background: url(../img/material-icons/folder.svg) no-repeat;
@@ -289,6 +301,7 @@ td.table-empty-message {
margin-top: units(1);
width: 100%;
border: 1px solid color('gray-60');
height: 40px;
}
}
@@ -534,11 +547,17 @@ td.table-empty-message {
background-color: #a1d3ff;
}
#template-list,
#template-list > div,
.sticky-scroll-area {
position: relative;
}
#template-list {
max-height: 500px;
overflow-y: auto;
padding: units(1) 0 units(1) units(1);
margin: units(2) 0 units(5);
margin: units(2) 0 units(6);
ul {
padding: 0;
margin: 0;
@@ -862,6 +881,10 @@ $do-dont-top-bar-width: 1;
border-radius: 2px;
}
.bg-gray-cool {
background-color: #dfe1e2;
}
.svg-circle-icon {
display: inline-block;
margin: 0;
@@ -1060,3 +1083,15 @@ nav.nav {
.usa-site-alert .usa-alert .usa-alert__body {
max-width: 75rem;
}
.usa-form-group--nested {
margin-top: 0;
}
.selection-content > ul > li.usa-checkbox {
margin-top: 1rem;
}
.selection-content .usa-form-group--nested li.usa-checkbox {
margin-top: 0;
}

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"))
@@ -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

@@ -1,7 +1,7 @@
from flask import abort, render_template, request, url_for
from app import current_service, job_api_client
from app.formatters import convert_time_unixtimestamp, get_time_left
from app.formatters import get_time_left
from app.main import main
from app.utils.pagination import (
generate_next_dict,
@@ -78,47 +78,43 @@ def handle_pagination(jobs, service_id, page):
return prev_page, next_page, pagination
JOB_STATUS_DELIVERED = "delivered"
JOB_STATUS_FAILED = "failed"
def get_job_statistics(job, status):
statistics = job.get("statistics", [])
for stat in statistics:
if stat.get("status") == status:
return stat.get("count")
return None
def create_job_dict_entry(job):
job_id = job.get("id")
can_download = get_time_left(job.get("created_at")) != "Data no longer available"
activity_time = job.get("processing_started") or job.get("created_at")
return {
"job_id": job_id,
"can_download": can_download,
"download_link": (
url_for(".view_job_csv", service_id=current_service.id, job_id=job_id)
if can_download
else None
),
"view_job_link": url_for(
".view_job", service_id=current_service.id, job_id=job_id
),
"activity_time": activity_time,
"created_by": job.get("created_by"),
"template_name": job.get("template_name"),
"delivered_count": get_job_statistics(job, JOB_STATUS_DELIVERED),
"failed_count": get_job_statistics(job, JOB_STATUS_FAILED),
}
def generate_job_dict(jobs):
return [
{
"job_id": job["id"],
"time_left": get_time_left(job["created_at"]),
"download_link": url_for(
".view_job_csv", service_id=current_service.id, job_id=job["id"]
),
"view_job_link": url_for(
".view_job", service_id=current_service.id, job_id=job["id"]
),
"created_at": job["created_at"],
"time_sent_data_value": convert_time_unixtimestamp(
job["processing_finished"]
if job["processing_finished"]
else (
job["processing_started"]
if job["processing_started"]
else job["created_at"]
)
),
"processing_finished": job["processing_finished"],
"processing_started": job["processing_started"],
"created_by": job["created_by"],
"template_name": job["template_name"],
"delivered_count": next(
(
stat["count"]
for stat in job.get("statistics", [])
if stat["status"] == "delivered"
),
None,
),
"failed_count": next(
(
stat["count"]
for stat in job.get("statistics", [])
if stat["status"] == "failed"
),
None,
),
}
for job in jobs["data"]
]
if not jobs or not jobs.get("data"):
return []
return [create_job_dict_entry(job) for job in jobs["data"]]

View File

@@ -1,12 +1,12 @@
from flask import current_app, redirect, render_template, session, url_for
from flask_login import current_user
from notifications_python_client.errors import HTTPError
from app import service_api_client
from app.formatters import email_safe
from app.main import main
from app.main.forms import CreateServiceForm
from app.utils.user import user_is_gov_user, user_is_logged_in
from notifications_python_client.errors import HTTPError
def _create_service(service_name, organization_type, email_from, form):

View File

@@ -1,12 +1,12 @@
from flask import jsonify, redirect, render_template, session, url_for
from flask_login import current_user
from notifications_python_client.errors import HTTPError
from app import current_service, notification_api_client, service_api_client
from app.main import main
from app.main.forms import SearchByNameForm
from app.models.template_list import TemplateList
from app.utils.user import user_has_permissions
from notifications_python_client.errors import HTTPError
from notifications_utils.recipients import format_phone_number_human_readable
from notifications_utils.template import SMSPreviewTemplate

View File

@@ -43,10 +43,9 @@ def service_dashboard(service_id):
service_data_retention_days = 7
active_jobs = [job for job in job_response if job["job_status"] != "cancelled"]
sorted_jobs = sorted(active_jobs, key=lambda job: job["created_at"], reverse=True)
job_lists = [
{**job_dict, "finished_processing": job_is_finished(job_dict)}
for job_dict in sorted_jobs
for job_dict in active_jobs
]
total_messages = service_api_client.get_service_message_ratio(service_id)

View File

@@ -1,6 +1,5 @@
from flask import flash, redirect, render_template, request, url_for
from flask_login import current_user
from notifications_python_client.errors import HTTPError
from app import user_api_client
from app.event_handlers import create_archive_user_event
@@ -8,6 +7,7 @@ from app.main import main
from app.main.forms import AdminSearchUsersByEmailForm, AuthTypeForm
from app.models.user import User
from app.utils.user import user_is_platform_admin
from notifications_python_client.errors import HTTPError
@main.route("/find-users-by-email", methods=["GET", "POST"])

View File

@@ -1,9 +1,9 @@
from flask import render_template, request
from notifications_python_client.errors import HTTPError
from app import user_api_client
from app.main import main
from app.main.forms import ForgotPasswordForm
from notifications_python_client.errors import HTTPError
@main.route("/forgot-password", methods=["GET", "POST"])

View File

@@ -1,3 +1,5 @@
import logging
from flask import (
abort,
current_app,
@@ -19,6 +21,8 @@ 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

View File

@@ -58,11 +58,11 @@ def view_job(service_id, job_id):
filter_args = parse_filter_args(request.args)
filter_args["status"] = set_status_filters(filter_args)
api_host_name = os.environ.get('API_HOST_NAME')
api_public_url = os.environ.get("API_PUBLIC_URL")
return render_template(
"views/jobs/job.html",
api_host_name=api_host_name,
api_public_url=api_public_url,
FEATURE_SOCKET_ENABLED=current_app.config["FEATURE_SOCKET_ENABLED"],
job=job,
status=request.args.get("status", ""),

View File

@@ -1,6 +1,5 @@
from flask import abort, flash, redirect, render_template, request, session, url_for
from flask_login import current_user
from notifications_python_client.errors import HTTPError
from app import current_service, service_api_client
from app.event_handlers import (
@@ -24,6 +23,7 @@ from app.main.forms import (
from app.models.user import InvitedUser, User
from app.utils.user import is_gov_user, user_has_permissions
from app.utils.user_permissions import permission_options
from notifications_python_client.errors import HTTPError
@main.route("/services/<uuid:service_id>/users")
@@ -49,7 +49,7 @@ def invite_user(service_id, user_id=None):
form = form_class(
inviter_email_address=current_user.email_address,
all_template_folders=current_service.all_template_folders,
folder_permissions=[f["id"] for f in current_service.all_template_folders],
folder_permissions=[],
)
if user_id:

View File

@@ -4,7 +4,6 @@ from functools import partial
from flask import flash, redirect, render_template, request, url_for
from flask_login import current_user
from notifications_python_client.errors import HTTPError
from app import current_organization, org_invite_api_client, organizations_client
from app.main import main
@@ -27,6 +26,7 @@ from app.models.organization import AllOrganizations, Organization
from app.models.user import InvitedOrgUser, User
from app.utils.csv import Spreadsheet
from app.utils.user import user_has_permissions, user_is_platform_admin
from notifications_python_client.errors import HTTPError
@main.route("/organizations", methods=["GET"])

View File

@@ -15,7 +15,6 @@ from flask import (
session,
url_for,
)
from notifications_python_client.errors import HTTPError
from app import (
billing_api_client,
@@ -46,6 +45,7 @@ from app.utils.pagination import (
get_page_from_request,
)
from app.utils.user import user_is_platform_admin
from notifications_python_client.errors import HTTPError
COMPLAINT_THRESHOLD = 0.02
FAILURE_THRESHOLD = 3

View File

@@ -13,12 +13,10 @@ from flask import (
session,
url_for,
)
from flask_login import current_user
from app import redis_client, user_api_client
from app.main import main
from app.main.forms import (
RegisterUserForm,
RegisterUserFromOrgInviteForm,
SetupUserProfileForm,
)
@@ -32,15 +30,7 @@ from app.utils.user import is_gov_user
@main.route("/register", methods=["GET", "POST"])
@hide_from_search_engines
def register():
if current_user and current_user.is_authenticated:
return redirect(url_for("main.show_accounts_or_dashboard"))
form = RegisterUserForm()
if form.validate_on_submit():
_do_registration(form, send_sms=False)
return redirect(url_for("main.registration_continue"))
return render_template("views/register.html", form=form)
abort(404)
@main.route("/register-from-org-invite", methods=["GET", "POST"])
@@ -108,10 +98,7 @@ def _do_registration(form, send_sms=True, send_email=True, organization_id=None)
@main.route("/registration-continue")
def registration_continue():
if not session.get("user_details"):
return redirect(url_for(".show_accounts_or_dashboard"))
else:
raise Exception("Unexpected routing in registration_continue")
abort(404)
def get_invite_data_from_redis(state):

View File

@@ -17,7 +17,6 @@ from flask import (
)
from flask_login import current_user
from markupsafe import Markup
from notifications_python_client.errors import HTTPError
from xlrd.biffh import XLRDError
from xlrd.xldate import XLDateError
@@ -52,6 +51,7 @@ from app.utils import (
from app.utils.csv import Spreadsheet, get_errors_for_csv
from app.utils.templates import get_template
from app.utils.user import user_has_permissions
from notifications_python_client.errors import HTTPError
from notifications_utils import SMS_CHAR_COUNT_LIMIT
from notifications_utils.insensitive_dict import InsensitiveDict
from notifications_utils.recipients import RecipientCSV, first_column_headings
@@ -481,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=(
@@ -560,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:
@@ -755,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):
@@ -879,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

View File

@@ -12,7 +12,6 @@ from flask import (
url_for,
)
from flask_login import current_user
from notifications_python_client.errors import HTTPError
from app import (
billing_api_client,
@@ -52,6 +51,7 @@ from app.main.forms import (
from app.utils import DELIVERED_STATUSES, FAILURE_STATUSES, SENDING_STATUSES
from app.utils.time import parse_naive_dt
from app.utils.user import user_has_permissions, user_is_platform_admin
from notifications_python_client.errors import HTTPError
PLATFORM_ADMIN_SERVICE_PERMISSIONS = OrderedDict(
[

View File

@@ -3,7 +3,6 @@ from functools import partial
from flask import abort, flash, jsonify, redirect, render_template, request, url_for
from flask_login import current_user
from markupsafe import Markup
from notifications_python_client.errors import HTTPError
from app import (
current_service,
@@ -29,6 +28,7 @@ from app.models.template_list import TemplateList, TemplateLists
from app.utils import NOTIFICATION_TYPES, should_skip_template_page
from app.utils.templates import get_template
from app.utils.user import user_has_permissions
from notifications_python_client.errors import HTTPError
from notifications_utils import SMS_CHAR_COUNT_LIMIT
form_objects = {

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

@@ -3,7 +3,6 @@ from datetime import datetime
from flask import abort, current_app, request, session
from flask_login import AnonymousUserMixin, UserMixin, login_user, logout_user
from notifications_python_client.errors import HTTPError
from werkzeug.utils import cached_property
from app.event_handlers import (
@@ -22,6 +21,7 @@ from app.utils.user_permissions import (
all_ui_permissions,
translate_permissions_from_db_to_ui,
)
from notifications_python_client.errors import HTTPError
def _get_service_id_from_view_args():

View File

@@ -2,10 +2,10 @@ import os
from flask import abort, current_app, has_request_context, request
from flask_login import current_user
from notifications_python_client import __version__
from notifications_python_client.base import BaseAPIClient
from app.extensions import redis_client
from notifications_python_client import __version__
from notifications_python_client.base import BaseAPIClient
from notifications_utils.clients.redis import RequestCache
cache = RequestCache(redis_client)

View File

@@ -1,9 +1,8 @@
from itertools import chain
from notifications_python_client.errors import HTTPError
from app.extensions import redis_client
from app.notify_client import NotifyAdminAPIClient, cache
from notifications_python_client.errors import HTTPError
class OrganizationsClient(NotifyAdminAPIClient):

View File

@@ -1,6 +1,8 @@
import json
from datetime import datetime, timezone
from flask import current_app
from app.extensions import redis_client
from app.notify_client import NotifyAdminAPIClient, _attach_current_user, cache
@@ -81,7 +83,13 @@ class ServiceAPIClient(NotifyAdminAPIClient):
"""
Retrieve a list of live services data with contact names and notification counts.
"""
return self.get("/service/live-services-data", params=params_dict)
try:
return self.get("/service/live-services-data", params=params_dict)
except Exception as e:
current_app.logger.error(
f"Error getting live services data {str(e)}", exc_info=True
)
raise e
def get_active_services(self, params_dict=None):
"""
@@ -136,19 +144,29 @@ class ServiceAPIClient(NotifyAdminAPIClient):
@cache.delete("live-service-and-organization-counts")
def update_status(self, service_id, live):
return self.update_service(
service_id,
message_limit=250000 if live else 50,
restricted=(not live),
go_live_at=str(datetime.utcnow()) if live else None,
)
try:
return self.update_service(
service_id,
message_limit=250000 if live else 50,
restricted=(not live),
go_live_at=str(datetime.utcnow()) if live else None,
)
except Exception as e:
current_app.logger.error(f"Error updating status {str(e)}", exc_info=True)
raise e
@cache.delete("live-service-and-organization-counts")
def update_count_as_live(self, service_id, count_as_live):
return self.update_service(
service_id,
count_as_live=count_as_live,
)
try:
return self.update_service(
service_id,
count_as_live=count_as_live,
)
except Exception as e:
current_app.logger.error(
f"Error updating count as live {str(e)}", exc_info=True
)
raise e
# This method is not cached because it calls through to one which is
def update_service_with_properties(self, service_id, properties):

View File

@@ -1,9 +1,9 @@
from flask import current_app
from notifications_python_client.errors import HTTPError
from app.notify_client import NotifyAdminAPIClient, cache
from app.utils import hilite
from app.utils.user_permissions import translate_permissions_from_ui_to_db
from notifications_python_client.errors import HTTPError
ALLOWED_ATTRIBUTES = {
"name",

View File

@@ -31,7 +31,7 @@ def get_csv_upload(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 = "\n".join(line for line in data.splitlines() if line.strip())
cleaned_data = "\r\n".join(line for line in data.splitlines() if line.strip())
filedata["data"] = cleaned_data
return filedata

View File

@@ -2,12 +2,12 @@ import time
import traceback
from flask import current_app, jsonify, request
from notifications_python_client.errors import HTTPError
from redis import RedisError
from app import status_api_client, version
from app.extensions import redis_client
from app.status import status
from notifications_python_client.errors import HTTPError
@status.route("/_status", methods=["GET"])

View File

@@ -11,6 +11,12 @@
{% 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 %}
@@ -29,35 +35,11 @@
{% block header %}
{% include 'components/usa_banner.html' %}
{% 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 %}
{% include 'components/header.html' %}
{% endblock %}
{% block main %}
<div class="grid-container">
<div class="grid-container minh-mobile">
{% block beforeContent %}
{% block backLink %}{% endblock %}
{% endblock %}
@@ -132,7 +114,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>
@@ -149,7 +131,7 @@
</button>
</li>
<li class="usa-button-group__item">
<button type="button" class="usa-button usa-button--unstyled padding-105 text-center" id="logOutTimer"
<button type="button" class="text-center usa-button usa-button--unstyled padding-105" id="logOutTimer"
data-close-modal>
Sign out
</button>
@@ -168,7 +150,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 %}
{#- 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

@@ -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 usa-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

@@ -1,48 +1,32 @@
{% set is_about_page = request.path.startswith('/about') %}
{% set is_contact_page = request.path.startswith('/contact') %}
{% set is_information_section = is_about_page or is_contact_page %}
{% if current_user.is_authenticated %}
{% set navigation = [
{"href": url_for("main.show_accounts_or_dashboard"), "text": "Current service", "active": request.path.startswith('/accounts')},
{"href": url_for('main.get_started'), "text": "Using Notify", "active": request.path.startswith('/using-notify')},
{"href": url_for('main.support'), "text": "Contact us", "active": header_navigation.is_selected('support')}
] %}
{% set navigation = [
{"href": url_for("main.show_accounts_or_dashboard"), "text": "Current service", "active": request.path.startswith('/accounts')},
{"href": url_for('main.get_started'), "text": "Using Notify", "active": request.path.startswith('/using-notify')},
{"href": url_for('main.support'), "text": "Contact us", "active": header_navigation.is_selected('support')}
] %}
{% if current_user.platform_admin %}
{% set navigation = navigation + [{"href": url_for('main.platform_admin_splash_page'), "text": "Platform admin", "active": header_navigation.is_selected('platform-admin')}] %}
{% else %}
{% set navigation = navigation + [{"href": url_for('main.user_profile'), "text": "User profile", "active": header_navigation.is_selected('user-profile')}] %}
{% endif %}
{% if current_service %}
{% if current_user.has_permissions('manage_service') %}
{% set secondaryNavigation = [
{"href": url_for('main.service_settings', service_id=current_service.id), "text": "Settings", "active": secondary_navigation.is_selected('settings')},
{"href": url_for('main.sign_out'), "text": "Sign out"}
] %}
{% else %}
{% set secondaryNavigation = [
{"href": url_for('main.sign_out'), "text": "Sign out"}
] %}
{% endif %}
{% else %}
{% set secondaryNavigation = [{"href": url_for('main.sign_out'), "text": "Sign out"}] %}
{% endif %}
{% if current_user.platform_admin %}
{% set navigation = navigation + [{"href": url_for('main.platform_admin_splash_page'), "text": "Platform admin", "active": header_navigation.is_selected('platform-admin')}] %}
{% else %}
{% set navigation = navigation + [{"href": url_for('main.user_profile'), "text": "User profile", "active": header_navigation.is_selected('user-profile')}] %}
{% endif %}
{% if current_service %}
{% if current_user.has_permissions('manage_service') %}
{% set secondaryNavigation = [
{"href": url_for('main.service_settings', service_id=current_service.id), "text": "Settings", "active": secondary_navigation.is_selected('settings')},
{"href": url_for('main.sign_out'), "text": "Sign out"}
] %}
{% else %}
{% set secondaryNavigation = [
{"href": url_for('main.sign_out'), "text": "Sign out"}
] %}
{% endif %}
{% else %}
{% set secondaryNavigation = [{"href": url_for('main.sign_out'), "text": "Sign out"}] %}
{% endif %}
{% else %}
{% set navigation = [
{"href": url_for('main.about_notify'), "text": "About Notify", "active": is_about_page},
{"href": url_for('main.contact'), "text": "Contact us", "active": is_contact_page}
] %}
{% endif %}
<header class="usa-header usa-header--extended">
<div class="usa-nav-container">
<div class="usa-navbar">
@@ -59,16 +43,7 @@
<button type="button" class="usa-menu-btn">Menu</button>
{% endif %}
</div>
{% if not current_user.is_authenticated and is_information_section%}
<div class="usa-nav__login">
<a class="usa-button usa-button login-button login-button--primary margin-right-2"
href="{{ initial_signin_url }}">Sign
in with <img src="{{ asset_url('images/logo-login.svg') }}" alt="Login.gov logo">
</a>
</div>
{% endif %}
</div>
</div>
<nav aria-label="Primary navigation" class="usa-nav">
<div class="usa-nav__inner">
@@ -103,7 +78,6 @@
{% endif %}
</ul>
</div>
</div>
</nav>
</div>

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

@@ -70,7 +70,7 @@
<span>Template</span>
</th>
<th data-sortable scope="col" role="columnheader" class="table-field-heading">
<span>Time sent</span>
<span>Started</span>
</th>
<th data-sortable scope="col" role="columnheader" class="table-field-heading">
<span>Sender</span>
@@ -96,13 +96,12 @@
</a>
</td>
<td class="table-field template">{{ job.template_name }}</td>
<td data-sort-value="{{job.time_sent_data_value}}" class="table-field time-sent">
{{ (job.processing_finished if job.processing_finished else job.processing_started
if job.processing_started else job.created_at)|format_datetime_table }}
<td data-sort-value="{{ job.activity_time | convert_time_unixtimestamp }}" class="table-field time-sent">
{{ job.activity_time|format_datetime_table }}
</td>
<td class="table-field sender">{{ job.created_by.name }}</td>
<td class="table-field report">
{% if job.time_left != "Data no longer available" %}
{% if job.can_download %}
<a href="{{ job.download_link }}">
<img src="{{ url_for('static', filename='img/material-icons/file_download.svg') }}" alt="">
<span class="usa-sr-only">Download report link</span>

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 %}
@@ -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 %}

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

@@ -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 %}

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

@@ -11,7 +11,10 @@
{% block maincolumn_content %}
{{ page_header("Message status") }}
<div data-job-id="{{ job.id }}" data-feature="{{FEATURE_SOCKET_ENABLED | lower}}" data-host="{{ api_host_name }}">
{% 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-resource="{{ updates_url }}"

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>
<div class="js-live-search-no-results" style="display: none;">
<p class="usa-body margin-0">No results found</p>
</div>
{% endif %}
<div class="user-list">
{% 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 %}
@@ -76,7 +76,7 @@
help='3' if help else 0
)}}" class='page-footer'>
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
<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'}}
@@ -84,9 +84,54 @@
{{ 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

@@ -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>

View File

@@ -1,6 +1,7 @@
{% extends "withnav_template.html" %}
{% from "components/page-header.html" import page_header %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/textbox.html" import textbox %}
{% from "components/form.html" import form_wrapper %}
{% from "components/components/back-link/macro.njk" import usaBackLink %}
@@ -9,7 +10,7 @@
{% endblock %}
{% block backLink %}
{{ usaBackLink({ "href": back_link }) }}
{{ usaBackLink(back_link) }}
{% endblock %}
@@ -38,10 +39,18 @@
data_force_focus=True
) %}
<div class="grid-row">
{% set extra_class = "extra-tracking" if form.placeholder_value.label.text == "phone number" else "" %}
{% set placeholder_id = "phone number" if form.placeholder_value.label.text == "phone number" else "" %}
<div class="grid-col-12 {% if form.placeholder_value.label.text == 'phone number' %}extra-tracking{% endif %}">
{{ form.placeholder_value(param_extensions={"classes": "", "id": "phone-number"}) }}
{% set is_phone_number = form.placeholder_value.label.text == "phone number" %}
{% set label_text = " phone number" if current_placeholder == "phone number" else current_placeholder %}
{% set extra_class = "extra-tracking" if is_phone_number else "" %}
<div class="grid-col-12 {{ extra_class }}">
{{ textbox(
form.placeholder_value,
label=label_text,
hint=hint_text,
extra_form_group_classes=extra_class,
param_extensions={"id": "phone-number", "classes": ""}
) }}
</div>
{% if skip_link or link_to_upload %}
<div class="grid-col-12 margin-top-1">

View File

@@ -12,7 +12,10 @@
{% block backLink %}
{{ usaBackLink(params) }}
{{ usaBackLink({
"href": url_for('main.send_one_off_step', service_id=current_service.id, template_id=template.id, step_index=0),
"html": "Back to select recipients"
}) }}
{% endblock %}
{% set phone_numbers = [
@@ -68,13 +71,14 @@
show_errors=False
)}}
</div>
<span id="upload-status-live" class="usa-sr-only" role="status" aria-live="polite" aria-atomic="true"></span>
<h2 class="font-body-lg">A spreadsheet is available to use</h2>
<div class="spreadsheet" data-module="fullscreen-table">
{% call(item, row_number) list_table(
example,
caption="Example",
caption="Example spreadsheet",
caption_visible=False,
field_headings=[''] + column_headings
) %}

View File

@@ -39,7 +39,7 @@
{% call row() %}
{{ text_field('Send text messages') }}
{{ boolean_field('sms' in current_service.permissions) }}
{{ edit_field(
{# {{ edit_field(
'Change',
url_for(
'.service_set_channel',
@@ -48,7 +48,7 @@
),
permissions=['manage_service'],
suffix='your settings for sending text messages',
)}}
)}} #}
{% endcall %}
{% if current_user.platform_admin %}

View File

@@ -4,199 +4,72 @@ import usaButton %} {% block meta %}
name="description"
content="Notify.gov lets you send text messages to your users. Try it now if you work in federal, state, or local government."
/>
{% endblock %} {% block pageTitle %} Notify.gov {% endblock %} {% block main %}
{% endblock %}
{% block pageTitle %} Notify.gov
{% if is_api_down %} - There's currently a technical issue {% endif %}
{% endblock %}
{% block main %}
{% block beforeContent %}{% endblock %}
<main id="main-content" role="main">
{% block content %}
<section class="usa-section--dark usa-hero" aria-label="Introduction">
<div class="grid-container padding-y-4">
<div class="grid-row grid-gap display-flex flex-align-center">
<div class="desktop:grid-col-8 tablet:grid-col-12">
<h1 class="font-sans-2xl usa-hero__heading">
Reach people where they are with government-powered text messages
</h1>
<p class="font-sans-lg">
Notify.gov is a text messaging service that helps federal, state,
local, tribal and territorial governments more effectively
communicate with the people they serve.
</p>
<div class="usa-button-group margin-bottom-5 flex-align-center">
<a
class="usa-button usa-button login-button login-button--primary margin-right-2"
href="{{ initial_signin_url }}"
>Sign in with
<img
src="{{ asset_url('images/logo-login.svg') }}"
alt="Login.gov logo"
/>
</a>
if you are an existing partner
</div>
</div>
<div
class="desktop:grid-col-3 grid-offset-1 desktop:display-block display-none margin-x-5"
>
<img
src="{{ asset_url('images/product/phone-text.png') }}"
alt="Illustration of a mobile phone displaying a text message and number on its screen, with a speech bubble coming out from outside the phone, symbolizing communication or notification."
/>
</div>
</div>
</div>
</section>
<section
class="grid-container usa-section usa-section__home border-top border-base-lighter usa-prose padding-bottom-1"
>
<h2 class="font-body-xl margin-top-0 margin-bottom-3">
Government texting made easy
</h2>
<p class="usa-body">
Notify.gov is a text messaging platform built for government agencies.
With minimal set-up and secure, personalized messaging, you can make
one-way texting a part of your outreach program.
</p>
</section>
<section
class="grid-container usa-section usa-section__home usa-prose padding-bottom-1"
>
<h2 class="font-sans-xl margin-top-0">Key features</h2>
<div class="home-cards margin-top-5">
<ul class="usa-card-group display-flex margin-bottom-4">
<li class="usa-card tablet:grid-col-4 mobile-lg:grid-col-12">
<div class="usa-card__container">
<div class="blue-bar"></div>
<img
src="{{ asset_url('images/internet.svg') }}"
alt="Globe on top of a web browser"
/>
<div class="usa-card__header">
<h3 class="font-heading-md">Web-based</h3>
</div>
<div class="usa-card__body">
<p>Nothing to download or install</p>
</div>
</div>
</li>
<li class="usa-card tablet:grid-col-4 mobile-lg:grid-col-12">
<div class="usa-card__container">
<div class="blue-bar"></div>
<img
src="{{ asset_url('images/fast.svg') }}"
alt="Stopwatch with a notification speech bubble with a star inside"
/>
<div class="usa-card__header">
<h3 class="font-heading-md">Fast and easy</h3>
</div>
<div class="usa-card__body">
<p>No technical expertise required</p>
</div>
</div>
</li>
<li class="usa-card tablet:grid-col-4 mobile-lg:grid-col-12">
<div class="usa-card__container">
<div class="blue-bar"></div>
<img
src="{{ asset_url('images/status.svg') }}"
alt="3 status messages, 2 successes and one failure"
/>
<div class="usa-card__header">
<h3 class="font-heading-md">Track message delivery</h3>
</div>
<div class="usa-card__body">
<p>See which messages were received</p>
</div>
</div>
</li>
</ul>
<ul class="usa-card-group">
<li class="usa-card tablet:grid-col-4 mobile-lg:grid-col-12">
<div class="usa-card__container">
<div class="blue-bar"></div>
<img
src="{{ asset_url('images/translation.svg') }}"
alt="Speech bubbles with the letter A and the Chinese character for language"
/>
<div class="usa-card__header">
<h3 class="font-heading-md">
Send in recipients' preferred language
</h3>
</div>
<div class="usa-card__body">
<p>Notify.gov has support for more than 30 character sets</p>
</div>
</div>
</li>
<li class="usa-card tablet:grid-col-4 mobile-lg:grid-col-12">
<div class="usa-card__container">
<div class="blue-bar"></div>
<img
src="{{ asset_url('images/security.svg') }}"
alt="Lock with code icon inside on top of a web browser"
/>
<div class="usa-card__header">
<h3 class="font-heading-md">Security and privacy</h3>
</div>
<div class="usa-card__body">
<p>
Limited data retention, encryption, and multi-factor
authentication protect user data and manage risk with <br><a href="/about/security">our security efforts</a>
{% if is_api_down %}
{% include "error/technical_difficulties.html" %}
{% else %}
<section class="usa-section--dark usa-hero usa-prose" aria-label="Introduction">
<div class="grid-container">
<div class="grid-row">
<div class="text-center grid-col-12 padding-y-4">
<h1 class="font-sans-2xl usa-hero__heading margin-bottom-2">
Sunsetting Notify.gov
</h1>
<p class="font-sans-lg margin-0">
This beta product is no longer in service as of June 9, 2025.
</p>
</div>
</div>
</li>
<li class="usa-card tablet:grid-col-4 mobile-lg:grid-col-12">
<div class="usa-card__container">
<div class="blue-bar"></div>
<img
src="{{ asset_url('images/send.svg') }}"
alt="Paper airplane and a notification icon with the number 1 inside"
/>
<div class="usa-card__header">
<h3 class="font-heading-md">
Send bulk, customized, one-way messages
</h3>
</div>
<div class="usa-card__body">
<p>
Send hundreds or thousands of individually customized messages
with just a few clicks
</div>
</section>
<section class="usa-section usa-prose" aria-label="Introduction">
<div class="grid-container padding-y-4">
<div class="grid-row grid-gap display-flex flex-align-center">
<div class="desktop:grid-col-8 tablet:grid-col-12">
<h2 class="font-body-xl">
Text messaging services
</h2>
<p class="usa-body">
Though the Notify.gov service is no longer available, government programs can continue to explore text messaging services.
</p>
<p class="usa-body">Commercial messaging providers may support government use cases. For agencies with the resources to set up and support it, <a href="https://github.com/GSA/notifications-api" class="usa-link">the notifications service codebase</a> that runs Notify.gov is open source and can be reused.</p>
</div>
</div>
</li>
</ul>
</div>
</section>
<section
class="grid-container usa-section usa-section__home usa-prose grid-container padding-bottom-10">
<div class="grid-row grid-gap-3">
<a
class="text-no-underline tablet:grid-col-4 mobile-lg:grid-col-12"
href="mailto:tts-notify@gsa.gov"
>
<div class="contact-us-card">
<div class="grid-row flex-align-center grid-gap-2">
<div class="grid-col-auto">
<div
class="desktop:grid-col-3 grid-offset-1 desktop:display-block display-none margin-x-5"
>
<img
src="{{ asset_url('images/contact.svg') }}"
alt=""
class="height-7 width-7"
src="{{ asset_url('images/messaging-devices.svg') }}"
alt="Illustration showing multiple devices including mobile phones and messaging interfaces representing government text messaging communication"
width="305"
height="304"
/>
</div>
<div class="grid-col">
<p class="margin-0">
<strong>Contact us</strong><br />
</div>
</div>
</section>
<section class="bg-gray-cool usa-section usa-prose" aria-label="Thank you message to partners">
<div class="grid-container">
<div class="grid-row flex-justify-center">
<div class="text-center grid-col-8">
<h2 class="font-body-xl text-primary margin-bottom-2">
To our partners
</h2>
<p class="usa-body margin-0">
Thank you to our users and partners for their support, participation, and contributions in developing Notify.gov.
</p>
</div>
</div>
</div>
</a>
</div>
</section>
</section>
{% endif %}
{% endblock %}
</main>
{% endblock %}

View File

@@ -40,7 +40,7 @@
<nav id="template-list" aria-label="Choose reply">
<ul>
{% for item in templates_and_folders %}
<li class="template-list-item {% if item.ancestors %}template-list-item-hidden-by-default{% endif %} {% if not item.ancestors %}template-list-item-without-ancestors{% endif %}">
<li class="template-list-item {% if item.ancestors %}template-list-item-hidden-by-default{% else %}template-list-item-without-ancestors{% endif %}">
{% for ancestor in item.ancestors %}
<a href="{{ url_for('.conversation_reply', service_id=current_service.id, notification_id=notification_id, from_folder=ancestor.id) }}" class="usa-link template-list-folder">
{{ ancestor.name }}

View File

@@ -32,9 +32,9 @@
{% else %}
<div class="grid-row flex-column">
<h1 class="font-body-2xl line-height-sans-2 margin-bottom-1 margin-top-0">{{page_title}}</h1>
<h1 class="font-body-2xl line-height-sans-2 margin-bottom-1 margin-top-0" id="page-title">{{page_title}}</h1>
<div class="{% if current_user.has_permissions('manage_templates') %} grid-col-10 {% else %} grid-col-12 {% endif %}">
<p class="margin-top-0 margin-bottom-4">
<p class="margin-top-0 margin-bottom-4" id="page-description">
Every message starts with a template. To send, choose or create a template.
</p>
{{ folder_path(
@@ -59,6 +59,10 @@
{{ live_search(target_selector='#template-list .template-list-item', show=show_search_box, form=search_form) }}
<div class="js-live-search-no-results js-hidden">
<p class="usa-body margin-top-2">No templates found</p>
</div>
{% if current_user.has_permissions('manage_templates') and user_has_template_folder_permission %}
{% call form_wrapper(
class='sticky-scroll-area',

View File

@@ -1,5 +1,6 @@
{% from "components/folder-path.html" import copy_folder_path, page_title_folder_path %}
{% from "components/live-search.html" import live_search %}
{% from "components/components/back-link/macro.njk" import usaBackLink %}
{% extends "withnav_template.html" %}
{% set page_title = "Copy an existing template" %}
@@ -8,6 +9,12 @@
{{ page_title }}
{% endblock %}
{% block backLink %}
{% if not from_service %}
{{ usaBackLink({ "href": url_for('.choose_template', service_id=current_service.id),
"html": "Back to all templates" }) }}
{% endif %}
{% endblock %}
{% block maincolumn_content %}
<div class="">
@@ -25,11 +32,14 @@
form=search_form,
autofocus=True
) }}
<div class="js-live-search-no-results" style="display: none;">
<p class="usa-body margin-top-2">No templates found</p>
</div>
<nav id="template-list" aria-label="Copy template list">
<ul>
{% for item in services_templates_and_folders %}
<li class="template-list-item margin-bottom-2 {% if item.ancestors %}template-list-item-hidden-by-default{% endif %} {% if not item.ancestors %}template-list-item-without-ancestors{% endif %}">
<li class="template-list-item margin-bottom-2">
{% if item.is_service %}
{% elif item.is_folder %}
{% else %}

View File

@@ -56,35 +56,33 @@
{{ template._template.updated_at|format_delta }}
</time>
</span>
<div>
<a class="usa-link margin-right-3"
href="{{ url_for('.view_template_versions', service_id=current_service.id, template_id=template.id) }}">See previous versions</a>
</div>
{% endif %}
{% if current_user.has_permissions('manage_templates') and user_has_template_permission %}
<h2 class="margin-bottom-1 font-body-lg">More actions</h2>
<ul class="usa-list usa-list--unstyled">
<li>
<a class="usa-link margin-right-3"
href="{{ url_for('.view_template_versions', service_id=current_service.id, template_id=template.id) }}">
See previous versions
</a>
</li>
{% if current_user.has_permissions('manage_templates') and user_has_template_permission %}
{% if not template._template.archived %}
<li>
<a class="usa-link margin-right-3"
href="{{ url_for('.delete_service_template', service_id=current_service.id, template_id=template.id) }}">
Delete this template
</a>
</li>
{% endif %}
{% if not template._template.redact_personalisation %}
<li>
<a class="usa-link"
href="{{ url_for('.confirm_redact_template', service_id=current_service.id, template_id=template.id) }}">
Hide all personalized and conditional content after sending
</a> for increased privacy protection
</li>
{% else %}
<li>
<p class="hint">Personalization is hidden after sending</p>
</li>
{% endif %}
{% if not template._template.archived %}
<li>
<a class="usa-link margin-right-3"
href="{{ url_for('.delete_service_template', service_id=current_service.id, template_id=template.id) }}">
Delete this template
</a>
</li>
{% endif %}
{% if not template._template.redact_personalisation %}
<li>
<a class="usa-link"
href="{{ url_for('.confirm_redact_template', service_id=current_service.id, template_id=template.id) }}">
Hide all personalized and conditional content after sending
</a> for increased privacy protection
</li>
{% else %}
<li>
<p class="hint">Personalization is hidden after sending</p>
</li>
{% endif %}
</ul>
{% endif %}

22
app/utils/api_health.py Normal file
View File

@@ -0,0 +1,22 @@
import logging
import os
import requests
from requests.exceptions import RequestException
logger = logging.getLogger(__name__)
def is_api_down():
api_base_url = os.getenv("API_HOST_NAME")
try:
response = requests.get(api_base_url, timeout=2)
is_down = response.status_code != 200
if is_down:
logger.warning(
f"API responded with status {response.status_code} at {api_base_url}"
)
return is_down
except RequestException as e:
logger.error(f"API down when loading homepage {e}")
return True

View File

@@ -198,6 +198,7 @@ def convert_report_date_to_preferred_timezone(db_date_str_in_utc):
def get_user_preferred_timezone():
if current_user and hasattr(current_user, "preferred_timezone"):
return current_user.preferred_timezone
tz = current_user.preferred_timezone
if tz in pytz.all_timezones:
return tz
return "US/Eastern"

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