Compare commits

...

697 Commits

Author SHA1 Message Date
Sheev Davé
f384ba00bb Update issue_template.yml
added accessibility secton
2025-01-27 11:49:05 -08:00
Beverly Nguyen
a5e2fd4e21 Merge pull request #2271 from GSA/1706-updaterevise-status-banner-on-confirmation-page 2025-01-27 09:35:48 -08:00
Alex Janousek
db13416e06 Merge pull request #2296 from GSA/dependabot/npm_and_yarn/babel/core-7.26.7
Bump @babel/core from 7.26.0 to 7.26.7
2025-01-27 09:15:43 -05:00
Alex Janousek
cc92642fa5 Merge pull request #2297 from GSA/dependabot/npm_and_yarn/rollup-4.32.0
Bump rollup from 4.31.0 to 4.32.0
2025-01-27 09:15:30 -05:00
dependabot[bot]
53b1e12b56 Bump rollup from 4.31.0 to 4.32.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.31.0 to 4.32.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.31.0...v4.32.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-24 23:06:57 +00:00
dependabot[bot]
296a964913 Bump @babel/core from 7.26.0 to 7.26.7
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.26.0 to 7.26.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.26.7/packages/babel-core)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-24 23:06:49 +00:00
Alex Janousek
c6dfc6c558 Merge pull request #2294 from GSA/dependabot/npm_and_yarn/playwright-1.50.0
Bump playwright from 1.49.1 to 1.50.0
2025-01-24 10:55:35 -05:00
dependabot[bot]
1566198343 Bump playwright from 1.49.1 to 1.50.0
Bumps [playwright](https://github.com/microsoft/playwright) from 1.49.1 to 1.50.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.49.1...v1.50.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-23 23:10:47 +00:00
Beverly Nguyen
954f1ccb55 Merge pull request #2266 from GSA/2168-when-a-user-schedules-a-job-they-should-see-scheduled-instead-of-sent-on-the-service-activity-page
Updating/Fix job status states
2025-01-23 11:21:04 -08:00
Beverly Nguyen
dafe86aad6 Merge pull request #2290 from GSA/2234-relabel-guidance-to-how-to
2234 relabel guidance to how to
2025-01-22 14:55:36 -08:00
Beverly Nguyen
aa03fc1cc0 Sentence case 2025-01-22 10:55:42 -08:00
Beverly Nguyen
cb41d9e706 changing guidance to how-do 2025-01-22 10:41:29 -08:00
Beverly Nguyen
0dfad834bf Merge pull request #2288 from GSA/update-join-notify-template 2025-01-22 08:45:23 -08:00
Beverly Nguyen
86dfdb66df Merge pull request #2287 from GSA/revert-2206-2125-send-message-a11y-audit-unique-ids 2025-01-22 08:44:47 -08:00
Carlo Costino
17c6cd6e03 Update no-cost service details
This changeset updates the no-cost service details to show the correct amount of messages for the first year (100,000 instead of 250,000).

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2025-01-22 10:32:28 -05:00
Beverly Nguyen
084a5e37fc Revert "Send Message A11Y Audit - Unique IDs and also refactor error message on templates page" 2025-01-21 22:20:44 -08:00
Beverly Nguyen
56af19637e Merge pull request #2283 from GSA/sheevdave-patch-1
Update pull_request_template.md
2025-01-21 16:43:47 -08:00
Beverly Nguyen
6615d4fccb Merge pull request #2206 from GSA/2125-send-message-a11y-audit-unique-ids
Send Message A11Y Audit - Unique IDs and also refactor error message on templates page
2025-01-21 15:30:13 -08:00
Beverly Nguyen
24cad0f8a1 fix test 2025-01-21 14:49:26 -08:00
Carlo Costino
4a773a5917 Merge pull request #2284 from GSA/bugfix/copy-change
Reverted change that accidentally pushed to main
2025-01-21 16:14:27 -05:00
alexjanousekGSA
16b43fa5bc Removed whitespace to trigger file change for PR 2025-01-21 16:03:50 -05:00
alexjanousekGSA
564db4cd84 Removing redundant text 2025-01-21 16:01:46 -05:00
alexjanousekGSA
561b2a345c Reverted change that accidentally pushed to main 2025-01-21 16:00:59 -05:00
alexjanousekGSA
5cde70a465 Removed redundant customize copy 2025-01-21 15:36:18 -05:00
Sheev Davé
ac79edf613 Update pull_request_template.md
Added a11y checks to PR template
2025-01-21 12:03:35 -08:00
Beverly Nguyen
2ab7244beb fix test and arrival session 2025-01-21 10:46:30 -08:00
Alex Janousek
8248833645 Merge pull request #2279 from GSA/dependabot/npm_and_yarn/rollup-4.31.0
Bump rollup from 4.30.1 to 4.31.0
2025-01-21 11:41:56 -05:00
Beverly Nguyen
f91af94001 removed comments 2025-01-20 16:00:21 -08:00
Beverly Nguyen
7be1872993 clean up templates 2025-01-20 15:21:32 -08:00
dependabot[bot]
261c2311bd Bump rollup from 4.30.1 to 4.31.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.30.1 to 4.31.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.30.1...v4.31.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 23:15:43 +00:00
Beverly Nguyen
82230f9e8b fixed testing 2025-01-20 14:34:11 -08:00
Beverly Nguyen
b6b110765a flake8 and fixing conditionals 2025-01-20 14:05:15 -08:00
Beverly Nguyen
f13595fd90 merge main 2025-01-20 12:52:51 -08:00
Kenneth Kehl
028a154ea7 Merge pull request #2268 from GSA/notify-admin-2245
get rid of some noise in status updates
2025-01-20 11:27:09 -08:00
Beverly Nguyen
3f1058f9b6 jest testing 2025-01-17 17:03:22 -08:00
Beverly Nguyen
9942ecf53e ajax applied to status 2025-01-17 16:30:59 -08:00
Beverly Nguyen
0168fc02df Merge pull request #2276 from GSA/2274-remove-in-a-bubble-text-from-why-text-messaging
adjust styling and content cards
2025-01-17 13:58:25 -08:00
Beverly Nguyen
b40999c646 adjust styling and content cards 2025-01-17 13:42:59 -08:00
Beverly Nguyen
7422b6160a Reformat 2025-01-16 18:22:13 -08:00
Beverly Nguyen
839bd0b3a9 remove service 2025-01-16 18:20:32 -08:00
Beverly Nguyen
79e8f02ec6 refactor code partial 2025-01-16 18:17:27 -08:00
Beverly Nguyen
dfe421b361 refactor code 2025-01-16 17:33:55 -08:00
Beverly Nguyen
7c5179994b update verbage 2025-01-16 12:09:09 -08:00
Beverly Nguyen
c6ed4a8661 changed pending state 2025-01-16 12:05:14 -08:00
Kenneth Kehl
1c77f8d60f fix test 2025-01-16 09:27:32 -08:00
Kenneth Kehl
6f7202eb30 fix test 2025-01-16 09:02:48 -08:00
Kenneth Kehl
3e8015ed50 get rid of some noise in status updates 2025-01-16 08:38:51 -08:00
Beverly Nguyen
ae083f4b52 update banner with different status states 2025-01-15 17:08:21 -08:00
Beverly Nguyen
8754c03a00 updating job status states 2025-01-15 14:28:47 -08:00
Beverly Nguyen
92935867ea Merge pull request #2247 from GSA/2227-acceptable-use-policy
2227 - Adding Acceptable Use Policy page
2025-01-15 10:12:33 -08:00
Beverly Nguyen
b8252aec66 Merge pull request #2264 from GSA/jb-add-link-to-about-studio
Added link to /studio and made some small style updates
2025-01-15 09:52:39 -08:00
Alex Janousek
920c9f4d33 Merge pull request #2263 from GSA/dependabot/npm_and_yarn/sass-embedded-1.83.4
Bump sass-embedded from 1.83.1 to 1.83.4
2025-01-15 12:47:13 -05:00
Jonathan Bobel
f5fe608f41 Added link to /studio and made some small style updates 2025-01-15 12:15:05 -05:00
dependabot[bot]
31c67abd36 Bump sass-embedded from 1.83.1 to 1.83.4
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.83.1 to 1.83.4.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.83.1...1.83.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-14 23:23:07 +00:00
Jonathan Bobel
b926b2da6f Merge pull request #2256 from GSA/feature/sidenav-expand-sublinks
Updated code to allow sidenav expand on click
2025-01-14 14:08:38 -05:00
alexjanousekGSA
dadfbc81e9 More content changes 2025-01-14 13:45:36 -05:00
alexjanousekGSA
8269fbbfa2 More content updates 2025-01-14 13:42:29 -05:00
alexjanousekGSA
ac211f3da1 Fixed one minor active state bug 2025-01-14 12:56:32 -05:00
alexjanousekGSA
a4968eae83 Added new backstop reference files 2025-01-14 12:38:44 -05:00
alexjanousekGSA
5a4021f625 Fixed last test hopefully 2025-01-14 12:10:23 -05:00
Jonathan Bobel
ab911ce942 Merge branch 'feature/sidenav-expand-sublinks' of https://github.com/GSA/notifications-admin into feature/sidenav-expand-sublinks 2025-01-14 09:55:56 -05:00
alexjanousekGSA
d5f4301747 More test fixes 2025-01-14 09:55:44 -05:00
alexjanousekGSA
cdf5d56938 Fixed more tests and pr comments 2025-01-14 09:30:52 -05:00
alexjanousekGSA
9666740af9 Fixing tests 2025-01-14 09:17:01 -05:00
Jonathan Bobel
872dbfd59a Merge branch 'main' of https://github.com/GSA/notifications-admin into feature/sidenav-expand-sublinks 2025-01-13 16:35:08 -05:00
alexjanousekGSA
369307f45a More test fixes 2025-01-13 16:07:32 -05:00
Jonathan Bobel
c59039d61d Merge branch 'feature/sidenav-expand-sublinks' of https://github.com/GSA/notifications-admin into feature/sidenav-expand-sublinks 2025-01-13 15:59:14 -05:00
alexjanousekGSA
b8735ea622 Fixed more tests 2025-01-13 15:53:57 -05:00
alexjanousekGSA
5994183c71 Fixing tests 2025-01-13 15:38:23 -05:00
alexjanousekGSA
2cfb069c9c Added line 2025-01-13 15:24:17 -05:00
alexjanousekGSA
66dfca579a Fixed test 2025-01-13 15:17:02 -05:00
alexjanousekGSA
0982e70a54 Fixed indention 2025-01-13 15:02:46 -05:00
alexjanousekGSA
52791cab7b Updated navigation links and backstopjs 2025-01-13 14:47:41 -05:00
Jonathan Bobel
ecadc49a55 Style and format updates 2025-01-13 13:57:59 -05:00
Jonathan Bobel
6d3bf9ae49 Merge branch 'feature/sidenav-expand-sublinks' of https://github.com/GSA/notifications-admin into feature/sidenav-expand-sublinks 2025-01-13 13:48:50 -05:00
alexjanousekGSA
6e0dd9e9ec Removed test that will break with next updates anyways 2025-01-13 12:53:44 -05:00
Jonathan Bobel
d580e131e3 Merge branch 'feature/sidenav-expand-sublinks' of https://github.com/GSA/notifications-admin into feature/sidenav-expand-sublinks 2025-01-13 12:45:12 -05:00
alexjanousekGSA
f047965ad4 Updating test 2025-01-13 12:45:01 -05:00
alexjanousekGSA
41ffb27d03 Trying one more test 2025-01-13 12:33:09 -05:00
Andrew Shumway
bb65ddb6a7 Merge pull request #2208 from GSA/dependabot/pip/phonenumbers-8.13.52
Bump phonenumbers from 8.13.48 to 8.13.52
2025-01-13 10:28:11 -07:00
dependabot[bot]
3666853f11 Bump phonenumbers from 8.13.48 to 8.13.52
Bumps [phonenumbers](https://github.com/daviddrysdale/python-phonenumbers) from 8.13.48 to 8.13.52.
- [Commits](https://github.com/daviddrysdale/python-phonenumbers/compare/v8.13.48...v8.13.52)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 17:22:21 +00:00
alexjanousekGSA
0ba7146012 Fixing end to end tests 2025-01-13 12:16:58 -05:00
alexjanousekGSA
cbfa11575d updated backstop files 2025-01-13 11:50:16 -05:00
alexjanousekGSA
e1b9985064 updated backstop files 2025-01-13 11:49:44 -05:00
alexjanousekGSA
36b9d2f772 Updated width of sidenav and fixed test 2025-01-13 11:42:48 -05:00
Jonathan Bobel
47cb8c27cc Merge branch 'main' of https://github.com/GSA/notifications-admin into feature/sidenav-expand-sublinks 2025-01-13 11:00:20 -05:00
Jonathan Bobel
50eeac806a Small content update 2025-01-13 10:32:49 -05:00
Jonathan Bobel
af5687349c Merge branch 'main' of https://github.com/GSA/notifications-admin into 2227-acceptable-use-policy 2025-01-13 10:31:49 -05:00
alexjanousekGSA
05e73da4e8 Fixing unit tests
'
2025-01-12 18:07:22 -05:00
alexjanousekGSA
c0d24b838a Fixed lint tests 2025-01-12 17:55:21 -05:00
alexjanousekGSA
b6353c41e5 Removed best practices flag 2025-01-12 17:42:15 -05:00
alexjanousekGSA
6441ae8ca7 Fixed missing login button on sublinks 2025-01-12 16:56:22 -05:00
alexjanousekGSA
817477bd72 Fixed bugs with sidenav 2025-01-10 16:06:55 -04:00
alexjanousekGSA
168d93a170 Updated code to allow sidenav expand on click 2025-01-09 12:00:50 -04:00
Alex Janousek
f012ab178f Merge pull request #2249 from GSA/dependabot/npm_and_yarn/sass-embedded-1.83.1
Bump sass-embedded from 1.83.0 to 1.83.1
2025-01-09 11:58:07 -04:00
dependabot[bot]
cd0507d199 Bump sass-embedded from 1.83.0 to 1.83.1
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.83.0 to 1.83.1.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.83.0...1.83.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-09 15:10:04 +00:00
Alex Janousek
907aeca70c Merge pull request #2254 from GSA/dependabot/npm_and_yarn/rollup-4.30.1
Bump rollup from 4.29.1 to 4.30.1
2025-01-09 10:51:15 -04:00
Jonathan Bobel
7b1018e867 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2227-acceptable-use-policy 2025-01-08 12:29:30 -05:00
Jonathan Bobel
7534de06e3 Merge pull request #2246 from GSA/2240-add-join-notify-to-the-main-nav
add side nav to join notify and contact page
2025-01-08 09:19:12 -05:00
Beverly Nguyen
227675c2c6 Merge branch 'main' into 2240-add-join-notify-to-the-main-nav 2025-01-07 15:54:44 -08:00
Beverly Nguyen
89ed31475d contact us side nav 2025-01-07 15:54:03 -08:00
Beverly Nguyen
322c23ab2f contact us 2025-01-07 15:49:32 -08:00
Beverly Nguyen
1aa589bbde Merge pull request #2225 from GSA/2224-fix-links-in-about-us-page
Quick fix: Links on the about us and join-notify needs to be updated
2025-01-07 15:41:36 -08:00
dependabot[bot]
85b19c4e2c Bump rollup from 4.29.1 to 4.30.1
Bumps [rollup](https://github.com/rollup/rollup) from 4.29.1 to 4.30.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.29.1...v4.30.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-07 23:40:58 +00:00
Carlo Costino
98e4334f2a Merge pull request #2251 from GSA/fix_broke_poetry
pin poetry to 1.8.5 for now
2025-01-07 13:30:53 -05:00
Kenneth Kehl
e9ba1c7726 pin poetry to 1.8.5 for now 2025-01-07 10:03:06 -08:00
Jonathan Bobel
02bf68989d Adjusting width in mobile 2025-01-06 12:49:39 -05:00
Jonathan Bobel
9ca9c1d504 2227 - Adding Acceptable Use Policy page 2025-01-06 10:40:35 -05:00
Beverly Nguyen
f176e86546 add side nav 2025-01-03 15:05:55 -08:00
Beverly Nguyen
5a437c91f8 Merge branch 'main' into 2224-fix-links-in-about-us-page 2025-01-03 14:01:56 -08:00
Beverly Nguyen
41ead43094 Merge pull request #2243 from GSA/2240-add-join-notify-to-the-main-nav
Add Join-Notify link to top nav
2025-01-03 13:56:34 -08:00
Beverly Nguyen
cbb2ecd6e4 Merge pull request #2232 from GSA/2210-user-story-update-home-page-phase-2-1
Updated css to add color for home page, updated backstop references
2025-01-03 13:50:04 -08:00
Beverly Nguyen
fd92d85636 add link to card 2025-01-03 13:21:07 -08:00
Beverly Nguyen
a1c76bc579 removed file 2025-01-03 13:07:49 -08:00
Beverly Nguyen
94c5eb5234 added side nav 2025-01-03 13:05:47 -08:00
Beverly Nguyen
3b2fa4314b add join notify link 2025-01-03 11:48:45 -08:00
alexjanousekGSA
b5d72a2062 Updated css to add color for home page, updated backstop references 2024-12-27 13:29:19 -05:00
Beverly Nguyen
c65352166d Merge pull request #2222 from GSA/2072-benefits-studio-about-page 2024-12-24 11:16:43 -08:00
Alex Janousek
44bf5d1478 Merge pull request #2216 from GSA/dependabot/npm_and_yarn/uswds/compile-1.2.1
Bump @uswds/compile from 1.2.0 to 1.2.1
2024-12-24 11:09:29 -05:00
Alex Janousek
7e8c9bcfc5 Merge pull request #2217 from GSA/dependabot/npm_and_yarn/uswds/uswds-3.11.0
Bump @uswds/uswds from 3.10.0 to 3.11.0
2024-12-24 11:08:59 -05:00
Alex Janousek
57e18d1e21 Merge pull request #2231 from GSA/dependabot/npm_and_yarn/rollup-4.29.1
Bump rollup from 4.28.1 to 4.29.1
2024-12-24 11:08:45 -05:00
dependabot[bot]
bc265ff4fd Bump rollup from 4.28.1 to 4.29.1
Bumps [rollup](https://github.com/rollup/rollup) from 4.28.1 to 4.29.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.28.1...v4.29.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-23 23:37:54 +00:00
Carlo Costino
231ce9f5a3 Merge pull request #2228 from GSA/bump-jinja2@3.1.5
Bump jinja2 from 3.1.4 to 3.1.5
2024-12-23 14:29:23 -05:00
Andrew Shumway
b60bbeb994 Bump jinja2 from 3.1.4 to 3.1.5 2024-12-23 12:14:35 -07:00
Beverly Nguyen
3da0ecc5f9 add links 2024-12-20 13:57:28 -08:00
Steven Reilly
e3674d1897 Merge pull request #2215 from GSA/feature/added-about-nav-button
Added nav button for about page
2024-12-20 16:25:16 -05:00
Jonathan Bobel
459ca8bed1 Updated navigation test 2024-12-20 14:46:13 -05:00
Jonathan Bobel
86060a5e02 White space updates 2024-12-20 14:04:25 -05:00
Jonathan Bobel
168a7b6446 2072 - Benefits Studio About Page 2024-12-20 13:38:01 -05:00
dependabot[bot]
5a4e755adc Bump @uswds/uswds from 3.10.0 to 3.11.0
Bumps [@uswds/uswds](https://github.com/uswds/uswds) from 3.10.0 to 3.11.0.
- [Release notes](https://github.com/uswds/uswds/releases)
- [Commits](https://github.com/uswds/uswds/compare/v3.10.0...v3.11.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-19 23:54:42 +00:00
dependabot[bot]
92db1bf426 Bump @uswds/compile from 1.2.0 to 1.2.1
Bumps [@uswds/compile](https://github.com/uswds/uswds-compile) from 1.2.0 to 1.2.1.
- [Release notes](https://github.com/uswds/uswds-compile/releases)
- [Commits](https://github.com/uswds/uswds-compile/compare/v1.2.0...v1.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-19 23:54:33 +00:00
Alex Janousek
51e4fb3789 Merge pull request #2187 from GSA/dependabot/npm_and_yarn/rollup-4.28.1
Bump rollup from 4.28.0 to 4.28.1
2024-12-19 13:00:41 -05:00
Alex Janousek
993e8f5052 Merge pull request #2212 from GSA/dependabot/npm_and_yarn/rollup/plugin-commonjs-28.0.2
Bump @rollup/plugin-commonjs from 28.0.1 to 28.0.2
2024-12-19 13:00:23 -05:00
Alex Janousek
22f25b316d Merge pull request #2203 from GSA/dependabot/npm_and_yarn/playwright-1.49.1
Bump playwright from 1.49.0 to 1.49.1
2024-12-19 12:48:41 -05:00
Alex Janousek
cc028816f1 Merge pull request #2205 from GSA/dependabot/npm_and_yarn/sass-embedded-1.83.0
Bump sass-embedded from 1.82.0 to 1.83.0
2024-12-19 12:48:23 -05:00
dependabot[bot]
c6d68185bf Bump @rollup/plugin-commonjs from 28.0.1 to 28.0.2
Bumps [@rollup/plugin-commonjs](https://github.com/rollup/plugins/tree/HEAD/packages/commonjs) from 28.0.1 to 28.0.2.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/commonjs/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/commonjs-v28.0.2/packages/commonjs)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-19 17:46:55 +00:00
dependabot[bot]
3461f38c67 Bump rollup from 4.28.0 to 4.28.1
Bumps [rollup](https://github.com/rollup/rollup) from 4.28.0 to 4.28.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.28.0...v4.28.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-19 17:46:53 +00:00
Alex Janousek
c1c298c31d Merge pull request #2213 from GSA/dependabot/npm_and_yarn/rollup/plugin-node-resolve-16.0.0
Bump @rollup/plugin-node-resolve from 15.3.0 to 16.0.0
2024-12-19 12:45:34 -05:00
alexjanousekGSA
ea20512f41 Added nav button for about page 2024-12-19 12:44:58 -05:00
Beverly Nguyen
1e261fd353 fixed testing 2024-12-18 15:30:48 -08:00
Beverly Nguyen
1df019e78c adding required html field 2024-12-18 12:40:45 -08:00
Steven Reilly
38da133066 Merge pull request #2197 from GSA/2133-small-a11y-updates
2133 small a11y updates
2024-12-18 13:46:05 -05:00
Beverly Nguyen
ca5e5ce04c Merge branch 'main' into 2125-send-message-a11y-audit-unique-ids 2024-12-17 11:48:05 -08:00
Beverly Nguyen
56381f5b27 adding id 2024-12-17 10:06:10 -08:00
Jonathan Bobel
e0738dd9bf Merge branch 'main' of https://github.com/GSA/notifications-admin into 2133-small-a11y-updates 2024-12-17 11:34:30 -05:00
Jonathan Bobel
89fe517a21 Merge pull request #2134 from GSA/2104-join-notify
Add Join Notify content page
2024-12-17 11:34:02 -05:00
Beverly Nguyen
6856ead422 Merge branch 'main' into 2104-join-notify 2024-12-16 23:01:18 -08:00
dependabot[bot]
15dbf4a4d7 Bump @rollup/plugin-node-resolve from 15.3.0 to 16.0.0
Bumps [@rollup/plugin-node-resolve](https://github.com/rollup/plugins/tree/HEAD/packages/node-resolve) from 15.3.0 to 16.0.0.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/node-resolve/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/commonjs-v16.0.0/packages/node-resolve)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 23:19:41 +00:00
Alex Janousek
12660ef3d8 Merge pull request #2189 from GSA/2175-user-story-update-home-page-phase-s1
Update Homepage Content
2024-12-16 15:22:30 -05:00
Beverly Nguyen
c090794d53 Merge pull request #2192 from GSA/2124-send-message-a11y-audit-error-messages-not-reading-correctly-in-voiceover
Added errors focus to empty field
2024-12-16 09:48:28 -08:00
Jonathan Bobel
1486680293 Updating new home page styles to use more from the USWDS, and make sure it's responsive and accessible 2024-12-13 12:37:11 -05:00
Beverly Nguyen
12636d6a69 adding error annoucement 2024-12-12 23:31:22 -08:00
Beverly Nguyen
b731cd62bb adding error annoucement 2024-12-12 23:08:25 -08:00
Beverly Nguyen
17f758bace added id and also refactor error message on templates page 2024-12-12 18:42:03 -08:00
dependabot[bot]
7aeb1c067d Bump sass-embedded from 1.82.0 to 1.83.0
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.82.0 to 1.83.0.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.82.0...1.83.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-12 23:38:33 +00:00
Jonathan Bobel
ad836d01be Fixing the ul 2024-12-12 11:06:58 -05:00
Jonathan Bobel
00949dc673 Moving ul to pass E2E test 2024-12-11 11:59:58 -05:00
Jonathan Bobel
649f3ee3ad Adding sr-only contextual content 2024-12-11 11:31:24 -05:00
Jonathan Bobel
e1e0a4dca0 Fixing test 2024-12-11 11:24:26 -05:00
Jonathan Bobel
1e3f15d98e Reverting as this should be addressed in a future issue 2024-12-11 10:56:34 -05:00
Jonathan Bobel
1a9408aeba Additional a11y updates 2024-12-11 10:30:16 -05:00
alexjanousekGSA
92f3794e61 Updated some text 2024-12-11 09:37:04 -05:00
alexjanousekGSA
dfef5203bf Fixed test 2024-12-11 09:34:24 -05:00
alexjanousekGSA
be5f789c5f Trying to get successful build 2024-12-11 09:15:18 -05:00
dependabot[bot]
4d0affee77 Bump playwright from 1.49.0 to 1.49.1
Bumps [playwright](https://github.com/microsoft/playwright) from 1.49.0 to 1.49.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.49.0...v1.49.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-10 23:14:25 +00:00
Beverly Nguyen
1f3d202a0d refactor a bit 2024-12-10 12:21:01 -08:00
Jonathan Bobel
00581521e7 Fixing tests 2024-12-10 14:50:36 -05:00
Jonathan Bobel
7f16edcfc7 Removing comments 2024-12-10 12:23:42 -05:00
Jonathan Bobel
4c710b6b12 2133 - small a11y updates 2024-12-10 12:21:01 -05:00
Beverly Nguyen
27abdc635e flake 2024-12-09 22:10:27 -08:00
Beverly Nguyen
2fb4b7538c added errors focus 2024-12-09 18:47:34 -08:00
alexjanousekGSA
e3bb69bc1c First commit of new updated homepage content 2024-12-09 12:53:38 -05:00
Beverly Nguyen
28a6b44a98 Merge pull request #2151 from GSA/2135-send-message-flow-h1-changes
2135 - Send Message A11Y Audit - Adjust headers in Send Message flow
2024-12-05 14:05:06 -08:00
Beverly Nguyen
7b56372415 Merge pull request #2128 from GSA/2105-contact
New Contact page
2024-12-05 14:03:34 -08:00
Beverly Nguyen
9c3560cf4e Merge pull request #2178 from GSA/2177-add-video-to-about-page
Add youtube video to about page
2024-12-05 14:02:30 -08:00
Beverly Nguyen
83c21ecefb fixed flake8 2024-12-04 14:33:05 -08:00
Beverly Nguyen
0f7d09ac74 fixed flake8 2024-12-04 14:32:17 -08:00
Beverly Nguyen
b49f579ece updated contact route 2024-12-04 14:29:49 -08:00
Beverly Nguyen
167cd2c3a0 Merge branch 'main' into 2105-contact 2024-12-04 14:27:03 -08:00
Beverly Nguyen
cce4997c63 moved join-notify out of about 2024-12-04 14:22:59 -08:00
Beverly Nguyen
a6a1aa0453 Merge branch 'main' into 2104-join-notify 2024-12-04 14:16:31 -08:00
Beverly Nguyen
cf45313ad8 added youtube video to about page 2024-12-04 14:10:59 -08:00
Alex Janousek
8e896eb57a Merge pull request #2164 from GSA/dependabot/pip/moto-5.0.22
Bump moto from 5.0.18 to 5.0.22
2024-12-04 12:26:59 -05:00
Jonathan Bobel
d684168a90 Style, clean up, a11y updates 2024-12-04 11:46:21 -05:00
Alex Janousek
3c621ee41d Merge pull request #2149 from GSA/dependabot/npm_and_yarn/cross-spawn-7.0.6
Bump cross-spawn from 7.0.3 to 7.0.6
2024-12-04 11:00:29 -05:00
dependabot[bot]
3728af6f40 Bump cross-spawn from 7.0.3 to 7.0.6
Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.6.
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.6)

---
updated-dependencies:
- dependency-name: cross-spawn
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-04 15:49:01 +00:00
Alex Janousek
46ee555d40 Merge pull request #2169 from GSA/dependabot/npm_and_yarn/rollup-4.28.0
Bump rollup from 4.27.3 to 4.28.0
2024-12-04 10:45:38 -05:00
Alex Janousek
0ba9943bb7 Merge pull request #2170 from GSA/dependabot/npm_and_yarn/sass-embedded-1.82.0
Bump sass-embedded from 1.81.0 to 1.82.0
2024-12-04 10:44:08 -05:00
Jonathan Bobel
30c249718d Merge branch '2135-send-message-flow-h1-changes' of https://github.com/GSA/notifications-admin into 2135-send-message-flow-h1-changes
# Conflicts:
#	app/templates/views/templates/template.html
2024-12-04 10:18:26 -05:00
Jonathan Bobel
b75d7dcd12 style changes 2024-12-04 10:17:29 -05:00
Beverly Nguyen
02bffa8c12 fixed testing 2024-12-03 17:15:52 -08:00
Beverly Nguyen
8468b4d5e0 fixed testing 2024-12-03 17:05:18 -08:00
Beverly Nguyen
9ef89666b0 fixed testing 2024-12-03 17:00:18 -08:00
dependabot[bot]
f45454b657 Bump sass-embedded from 1.81.0 to 1.82.0
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.81.0 to 1.82.0.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.81.0...1.82.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-03 23:27:20 +00:00
dependabot[bot]
d275e7b6a3 Bump rollup from 4.27.3 to 4.28.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.27.3 to 4.28.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.27.3...v4.28.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-03 23:27:08 +00:00
Jonathan Bobel
d92255c427 Merge branch 'main' of https://github.com/GSA/notifications-admin into 2135-send-message-flow-h1-changes 2024-12-03 17:00:04 -05:00
Jonathan Bobel
35c1379853 Merge branch '2135-send-message-flow-h1-changes' of https://github.com/GSA/notifications-admin into 2135-send-message-flow-h1-changes 2024-12-03 16:17:49 -05:00
Beverly Nguyen
4946bed5cc fixed title testing 2024-12-03 13:05:55 -08:00
Beverly Nguyen
078f75b8a4 Merge pull request #2154 from GSA/2119-clean-up-best-practices-folders-and-components
2119 clean up best practices folders and components
2024-12-03 12:08:52 -08:00
Jonathan Bobel
b7b57149fc Merge branch '2135-send-message-flow-h1-changes' of https://github.com/GSA/notifications-admin into 2135-send-message-flow-h1-changes 2024-12-03 09:51:30 -05:00
Jonathan Bobel
b01f5be5bf Merge remote-tracking branch 'origin' into 2135-send-message-flow-h1-changes 2024-12-03 09:45:15 -05:00
dependabot[bot]
7ffb4b60de Bump moto from 5.0.18 to 5.0.22
Bumps [moto](https://github.com/getmoto/moto) from 5.0.18 to 5.0.22.
- [Release notes](https://github.com/getmoto/moto/releases)
- [Changelog](https://github.com/getmoto/moto/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getmoto/moto/compare/5.0.18...5.0.22)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-03 00:08:10 +00:00
Beverly Nguyen
66c377c39d changed page title and h1 on choose.html 2024-12-02 14:22:45 -08:00
Alex Janousek
4170ca7577 Merge pull request #2132 from GSA/2109-build-out-architecture-for-new-about-pages-behind-feature-flag
Added new header button that is displayed in header
2024-12-02 14:38:27 -05:00
Jonathan Bobel
994a314f31 Trying to decouple this h1 from the templates folder structure 2024-12-02 12:09:43 -05:00
Jonathan Bobel
6218d3eadd Adjusting tests 2024-12-02 10:53:06 -05:00
Jonathan Bobel
9a387923bf Merge branch 'main' of https://github.com/GSA/notifications-admin into 2135-send-message-flow-h1-changes 2024-12-02 10:00:07 -05:00
Jonathan Bobel
b98e3d87e2 Fixing tests 2024-12-02 09:59:58 -05:00
Beverly Nguyen
68e5ac50ab fix testing 2024-11-27 10:14:09 -08:00
Beverly Nguyen
5e114094c8 merge main 2024-11-27 09:56:13 -08:00
Carlo Costino
162d3708ab Merge pull request #2163 from GSA/bump-admin-prod-memory
Bump admin production memory to 2GB per instance
2024-11-27 09:29:45 -05:00
Carlo Costino
3dd8d25089 Bump admin production memory to 2GB per instance
This changeset bumps the admin production memory to 2GB per instance.  We were noticing that the admin app was consuming almost all of the 1.5GB memory currently.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-11-26 21:02:45 -05:00
Carlo Costino
de81866288 Merge pull request #2162 from GSA/2161-toggle-side-nav-items-when-featured-flag-is-onoff
making sub nav items conditional based on feature flag
2024-11-26 20:44:23 -05:00
Beverly Nguyen
a5c65439b6 update e2e 2024-11-26 14:38:15 -08:00
Beverly Nguyen
e638eb4ad1 isort fix 2024-11-26 13:50:00 -08:00
Beverly Nguyen
d4c646a788 making sub nav items conditional on feature flag 2024-11-26 13:45:43 -08:00
Beverly Nguyen
562f835096 convert include to macros 2024-11-26 12:58:32 -08:00
Beverly Nguyen
2fa9c1ed7d removed unnecessary route 2024-11-26 12:24:06 -08:00
alexjanousekGSA
1931e4359b Fixed more imports 2024-11-26 10:46:41 -05:00
Alex Janousek
c37fd5d461 Merge branch 'main' into 2109-build-out-architecture-for-new-about-pages-behind-feature-flag 2024-11-26 10:22:36 -05:00
Beverly Nguyen
d5ef2647fd changed naming 2024-11-25 18:23:15 -08:00
Beverly Nguyen
86ddcd3647 changed naming 2024-11-25 18:16:43 -08:00
Beverly Nguyen
276802a6c4 changed naming 2024-11-25 18:15:34 -08:00
Beverly Nguyen
9abfcf71de Merge pull request #2127 from GSA/2103-aboutsecurity
About Security Content
2024-11-25 16:51:36 -08:00
alexjanousekGSA
2d0a53e97d Sorted init 2024-11-25 13:51:24 -05:00
alexjanousekGSA
497533c52e More linting stuff 2024-11-25 13:40:14 -05:00
alexjanousekGSA
1763e75bef Cleaning up imports 2024-11-25 13:33:33 -05:00
alexjanousekGSA
c941e14587 Added more spacing 2024-11-25 13:24:47 -05:00
Carlo Costino
a01b93073b Merge pull request #2147 from GSA/notify-admin-1426
add carrier column to reports
2024-11-25 12:14:45 -05:00
alexjanousekGSA
c768b09255 Fixed indenting 2024-11-25 11:51:01 -05:00
Jonathan Bobel
90c7386b63 Header fix 2024-11-22 16:53:07 -05:00
Jonathan Bobel
35958769f4 Send Message A11Y Audit - Adjust headers in Send Message flow 2024-11-22 16:45:25 -05:00
Beverly Nguyen
76c10b7f90 Merge branch 'main' into 2103-aboutsecurity 2024-11-22 10:57:29 -08:00
Kenneth Kehl
1417f12ccf merge from main 2024-11-22 07:47:47 -08:00
Carlo Costino
971db71936 Merge pull request #2144 from GSA/redis-dependency-ignore-vulncheck
Add redis ID to ignore vulnerability list in audit/no current fix
2024-11-22 10:46:14 -05:00
Kenneth Kehl
8f30064f50 add carrier column to reports 2024-11-21 15:08:49 -08:00
alexjanousekGSA
8231b671af Updated logic in init to include nonce and state and removed from index 2024-11-21 17:52:44 -05:00
Beverly Nguyen
637457c8c2 merge main 2024-11-21 12:41:30 -08:00
Beverly Nguyen
daabee672e Merge pull request #2117 from GSA/2102-aboutwhy-text-messaging
About/why text messaging content
2024-11-21 12:36:50 -08:00
Andrew Shumway
598a9af6f1 Add redis ID to ignore vulnerability list in audit/no current fix 2024-11-21 11:42:30 -07:00
Beverly Nguyen
8672960871 content update 2024-11-20 11:14:09 -08:00
Beverly Nguyen
9483c099db update content 2024-11-20 11:11:12 -08:00
Beverly Nguyen
a8ecb57e51 removed logged in 2024-11-20 10:25:39 -08:00
Beverly Nguyen
a318b2dd0f updated external links 2024-11-20 09:49:52 -08:00
Beverly Nguyen
942489dc57 updated external links 2024-11-20 09:43:12 -08:00
Beverly Nguyen
93587f528e Merge pull request #2074 from GSA/2073---new-best-practice-side-nav-end2end
e2e test for best practice content pages
2024-11-20 09:33:55 -08:00
Beverly Nguyen
99d934c949 Merge pull request #2087 from GSA/1939-accessibility-audit-the-entire-send-message-flow-with-a-few-branching-situations-like-scheduling-a-send-vs-now
Fix a11y errors within the send flow
2024-11-20 09:33:15 -08:00
Beverly Nguyen
9e6dd5df89 links updated 2024-11-19 18:10:29 -08:00
Beverly Nguyen
3a6295b7a2 update contact 2024-11-19 18:06:23 -08:00
Beverly Nguyen
8d5581505b a11y 2024-11-19 12:34:51 -08:00
Beverly Nguyen
4a41c61c56 updatel link 2024-11-19 12:26:26 -08:00
Beverly Nguyen
b4cc2a7dea styling 2024-11-19 12:23:35 -08:00
Beverly Nguyen
9e8e7910dc added content and styling 2024-11-19 10:59:58 -08:00
alexjanousekGSA
9b246aa03f Fixed indent 2024-11-19 12:06:09 -05:00
alexjanousekGSA
9023943bb1 Fixed a few errors 2024-11-19 10:49:30 -05:00
alexjanousekGSA
9a8d8e12cf Added new header button that is displayed in header 2024-11-19 09:41:08 -05:00
Alex Janousek
f9034511c7 Merge pull request #2113 from GSA/dependabot/npm_and_yarn/uswds/uswds-3.10.0
Bump @uswds/uswds from 3.9.0 to 3.10.0
2024-11-19 08:27:31 -05:00
Alex Janousek
1d2abf0491 Merge pull request #2121 from GSA/dependabot/npm_and_yarn/sass-embedded-1.81.0
Bump sass-embedded from 1.80.6 to 1.81.0
2024-11-19 08:27:20 -05:00
Alex Janousek
b0b2132c67 Merge pull request #2130 from GSA/dependabot/npm_and_yarn/rollup-4.27.3
Bump rollup from 4.24.4 to 4.27.3
2024-11-19 08:26:31 -05:00
Alex Janousek
aae1a0d46c Merge pull request #2131 from GSA/dependabot/npm_and_yarn/playwright-1.49.0
Bump playwright from 1.48.2 to 1.49.0
2024-11-19 08:26:15 -05:00
dependabot[bot]
a740183a76 Bump playwright from 1.48.2 to 1.49.0
Bumps [playwright](https://github.com/microsoft/playwright) from 1.48.2 to 1.49.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.48.2...v1.49.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-19 00:00:13 +00:00
dependabot[bot]
9faa0ed069 Bump rollup from 4.24.4 to 4.27.3
Bumps [rollup](https://github.com/rollup/rollup) from 4.24.4 to 4.27.3.
- [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.24.4...v4.27.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-19 00:00:02 +00:00
Beverly Nguyen
9a5a960e57 contact content 2024-11-18 14:00:52 -08:00
Beverly Nguyen
de8c4b7204 test 2024-11-18 13:41:32 -08:00
Beverly Nguyen
2ba369100c content 2024-11-18 13:35:24 -08:00
Beverly Nguyen
655ecb60e9 update sub links 2024-11-18 11:59:00 -08:00
Beverly Nguyen
0b81ed0247 changes to nav 2024-11-18 11:49:39 -08:00
Beverly Nguyen
df0e159550 merge main and nav 2024-11-18 10:41:45 -08:00
Jonathan Bobel
0a50913e62 Merge pull request #2112 from GSA/2101-about-notify
About Notify - About pages
2024-11-18 13:20:39 -05:00
dependabot[bot]
dba031dd23 Bump sass-embedded from 1.80.6 to 1.81.0
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.80.6 to 1.81.0.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.80.6...1.81.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-15 23:18:56 +00:00
Beverly Nguyen
0138930172 assets 2024-11-15 13:31:14 -08:00
Beverly Nguyen
7390b60f2a padding change 2024-11-15 11:45:57 -08:00
alexjanousekGSA
c432e434ae Updated url 2024-11-15 12:12:04 -05:00
alexjanousekGSA
5b48127155 Fixed linting error 2024-11-15 12:00:06 -05:00
alexjanousekGSA
2aa5dd0174 Added back removed code 2024-11-15 11:55:16 -05:00
Carlo Costino
2106f00c08 Merge pull request #2118 from GSA/ADMIN-2086_Update_README_First_User_Docs
ADMIN-2086: Updated documentation.
2024-11-15 11:21:21 -05:00
Cliff Hill
4b50dfc702 Updated documentation.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-15 08:44:32 -05:00
Beverly Nguyen
cd7df2f9d2 flake8 2024-11-14 16:25:37 -08:00
Beverly Nguyen
170e06aba0 merge main 2024-11-14 16:18:35 -08:00
Beverly Nguyen
523c00f3a6 update images 2024-11-14 15:45:27 -08:00
Beverly Nguyen
ff4ee646ca content change 2024-11-14 14:00:05 -08:00
Alex Janousek
63493f28f8 Merge pull request #2078 from GSA/2069-user-story-add-new-link-to-best-practices-page
Added link to new guidance page that enables navigating
2024-11-14 16:52:52 -05:00
Beverly Nguyen
55ae37ad80 note to add youtube video 2024-11-14 11:23:23 -08:00
Beverly Nguyen
ba44ff5e8e content added 2024-11-14 09:58:04 -08:00
alexjanousekGSA
70ecf8fa09 Added feature flag for route 2024-11-14 10:53:48 -05:00
dependabot[bot]
c5fa28d42b Bump @uswds/uswds from 3.9.0 to 3.10.0
Bumps [@uswds/uswds](https://github.com/uswds/uswds) from 3.9.0 to 3.10.0.
- [Release notes](https://github.com/uswds/uswds/releases)
- [Commits](https://github.com/uswds/uswds/compare/v3.9.0...v3.10.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-13 23:41:55 +00:00
Beverly Nguyen
3a52cba23e add testing 2024-11-13 15:02:35 -08:00
Beverly Nguyen
8d85da8a90 add testing 2024-11-13 15:00:40 -08:00
Carlo Costino
ad50568c10 Merge pull request #2111 from GSA/Disabling_verify_email_for_now
Ok, commenting out the check for emails for now.
2024-11-13 17:35:08 -05:00
Beverly Nguyen
50e7f3d33c first round of about content 2024-11-13 14:32:15 -08:00
Cliff Hill
9796d424b5 Flake8 is dumb.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-13 17:27:52 -05:00
Cliff Hill
d678659cbe Flake8 is annoying.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-13 17:23:57 -05:00
Cliff Hill
49932f6942 Ok, commenting out the check for emails for now.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-13 17:18:51 -05:00
Cliff Hill
0091fd0b31 Merge pull request #2110 from GSA/Fixing_verify_email_again
Re-fixing the verify email step.
2024-11-13 14:48:40 -05:00
Cliff Hill
683bf893c1 fixing things.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-13 14:34:34 -05:00
Steven Reilly
a95138f344 Merge pull request #2108 from GSA/ADMIN-2098_Fix_Login_For_Email_Verify_And_Expire_Redis_Stuff
Fixed email verify, put time limits on redis stuff.
2024-11-13 12:59:26 -05:00
Cliff Hill
cc5c4114e0 Fixed email verify, put time limits on redis stuff.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-13 10:58:40 -05:00
alexjanousekGSA
3da5fb406e Added subnav to fix css 2024-11-13 10:30:06 -05:00
alexjanousekGSA
b9ef8ea0c0 Removed unused code 2024-11-13 10:26:06 -05:00
alexjanousekGSA
6ca902acd3 Added back guides because its needed 2024-11-13 10:18:12 -05:00
alexjanousekGSA
b8ea1d812a Fixed error 2024-11-13 10:01:33 -05:00
alexjanousekGSA
c4ee02f038 Removed unused navigation link 2024-11-13 09:52:37 -05:00
alexjanousekGSA
f6fbe1bd8d Fixed linting error 2024-11-12 13:07:57 -05:00
alexjanousekGSA
1a14becc9a Updated link name and route 2024-11-12 12:54:22 -05:00
alexjanousekGSA
13e9b12367 Renamed guides to best practices 2024-11-12 10:32:51 -05:00
Steven Reilly
01e52b9a20 Merge pull request #2093 from GSA/fix-login-staging-env-var-url
Fix Login.gov sign in URL formatting for staging
2024-11-08 11:04:21 -05:00
Carlo Costino
044f1cf170 Fix flake8 warnings on comments
Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-11-08 10:53:20 -05:00
Carlo Costino
8f89d25909 Comment out part of test
This is due to recent changes in the API and an error now being thrown because the job cache cannot be properly accessed.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-11-08 10:45:07 -05:00
Jonathan Bobel
3afffde6cb Merge pull request #2076 from GSA/2056-template-creation-flow-voiceover-gets-stuck-in-a-loop
Template voiceover gets stuck in a loop #2056
2024-11-08 10:13:32 -05:00
Carlo Costino
312612a04d Fix Login.gov sign in URL formatting for staging
This changeset fixes a typo by removing an extra E from the Login.gov sign in URL, which was causing the STATE variable to not be properly replaced with the actual state, because STATE != STATEE.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-11-07 22:22:24 -05:00
Carlo Costino
fe00050e1f Merge pull request #2075 from GSA/USN-COMPLY-51-Verify_State
Verify state for login.gov
2024-11-07 14:18:17 -05:00
Alex Janousek
822fa6f397 Merge pull request #2084 from GSA/dependabot/npm_and_yarn/multi-9f37c16f8f
Bump cookie and express
2024-11-07 12:51:22 -05:00
Cliff Hill
e9b515d4cc Another test fixed.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-07 12:01:06 -05:00
Cliff Hill
923a345d19 Fixed tests.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-07 11:56:03 -05:00
Cliff Hill
6e3a569a0a Resend invites works.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-07 09:56:18 -05:00
Cliff Hill
14bbabcab7 Invites are now working.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-07 08:37:45 -05:00
Beverly Nguyen
c85bbb47eb fixing css 2024-11-06 16:05:33 -08:00
Cliff Hill
95a39cfd31 Trying to get invites to flow correctly.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-06 16:04:18 -05:00
Cliff Hill
f363a8e184 Getting all the needed data in place.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-06 14:30:28 -05:00
Cliff Hill
d798d3695e More little fixes.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-06 10:48:28 -05:00
Cliff Hill
c8ed66cbfe Storing user data in redis.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-06 10:41:20 -05:00
Cliff Hill
b532ce8959 Fixing tests, and resend invites endpoint.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-06 08:20:11 -05:00
Cliff Hill
fc09e70579 Working on fixing the tests. 2024-11-06 08:20:11 -05:00
Cliff Hill
a090c90ed6 Debuggin'
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-06 08:20:11 -05:00
Cliff Hill
a39c844c30 Properly handling and validating the state for login.gov
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-06 08:20:10 -05:00
Cliff Hill
a02448a0fa Removing unused state parameter for _get_access_token()
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-11-06 08:20:10 -05:00
Beverly Nguyen
ca96495e3d revert changes to color:transparent 2024-11-05 15:47:49 -08:00
Beverly Nguyen
7a63fcfc08 fix a11y errors 2024-11-05 14:35:22 -08:00
dependabot[bot]
0500da354d Bump cookie and express
Bumps [cookie](https://github.com/jshttp/cookie) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `cookie` from 0.6.0 to 0.7.1
- [Release notes](https://github.com/jshttp/cookie/releases)
- [Commits](https://github.com/jshttp/cookie/compare/v0.6.0...v0.7.1)

Updates `express` from 4.21.0 to 4.21.1
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.1/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.21.0...4.21.1)

---
updated-dependencies:
- dependency-name: cookie
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-05 17:56:50 +00:00
Alex Janousek
ff194b2f2b Merge pull request #2082 from GSA/dependabot/npm_and_yarn/sass-embedded-1.80.6
Bump sass-embedded from 1.80.5 to 1.80.6
2024-11-05 12:56:03 -05:00
Alex Janousek
0aa2c76f9a Merge pull request #2083 from GSA/dependabot/npm_and_yarn/rollup-4.24.4
Bump rollup from 4.24.3 to 4.24.4
2024-11-05 12:55:48 -05:00
dependabot[bot]
2503eac887 Bump rollup from 4.24.3 to 4.24.4
Bumps [rollup](https://github.com/rollup/rollup) from 4.24.3 to 4.24.4.
- [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.24.3...v4.24.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 23:49:15 +00:00
dependabot[bot]
1564507e13 Bump sass-embedded from 1.80.5 to 1.80.6
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.80.5 to 1.80.6.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.80.5...1.80.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 23:49:02 +00:00
alexjanousekGSA
5cbb1f3bef Updated route 2024-11-04 15:04:34 -05:00
Alex Janousek
737d7b70bf Merge pull request #2065 from GSA/dependabot/npm_and_yarn/babel/preset-env-7.26.0
Bump @babel/preset-env from 7.25.9 to 7.26.0
2024-11-04 12:47:55 -05:00
Alex Janousek
937e258d2b Merge pull request #2066 from GSA/dependabot/npm_and_yarn/playwright-1.48.2
Bump playwright from 1.48.1 to 1.48.2
2024-11-04 12:47:40 -05:00
dependabot[bot]
569de1ab49 Bump @babel/preset-env from 7.25.9 to 7.26.0
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.25.9 to 7.26.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.0/packages/babel-preset-env)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 17:13:47 +00:00
dependabot[bot]
154912fda5 Bump playwright from 1.48.1 to 1.48.2
Bumps [playwright](https://github.com/microsoft/playwright) from 1.48.1 to 1.48.2.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.48.1...v1.48.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 17:13:02 +00:00
Alex Janousek
8c3b83091d Merge pull request #2064 from GSA/dependabot/npm_and_yarn/babel/core-7.26.0
Bump @babel/core from 7.25.8 to 7.26.0
2024-11-04 12:12:25 -05:00
Alex Janousek
78474aea65 Merge pull request #2070 from GSA/dependabot/npm_and_yarn/sass-embedded-1.80.5
Bump sass-embedded from 1.80.4 to 1.80.5
2024-11-04 12:11:58 -05:00
Alex Janousek
643b4a3d7c Merge pull request #2071 from GSA/dependabot/npm_and_yarn/rollup-4.24.3
Bump rollup from 4.24.0 to 4.24.3
2024-11-04 12:11:39 -05:00
alexjanousekGSA
5fa9172901 Fixing linting errors 2024-11-04 11:57:13 -05:00
alexjanousekGSA
e7c82b1fc3 Fixed indent 2024-11-04 11:50:29 -05:00
alexjanousekGSA
12c28682df Added link to new guidance page that enables navigating 2024-11-04 11:44:45 -05:00
Beverly Nguyen
66d18ced10 fixed testing 2024-11-01 12:16:22 -07:00
Beverly Nguyen
334cd4041a fixed managed folder position 2024-11-01 12:00:00 -07:00
Beverly Nguyen
4d0d92f825 added attributes for a11y 2024-11-01 11:47:25 -07:00
Beverly Nguyen
714be40851 fix testing 2024-10-31 12:26:20 -07:00
Beverly Nguyen
109f3d9992 feature flag for testing 2024-10-31 12:04:26 -07:00
Beverly Nguyen
e09eabd8ae Merge branch 'main' into 2073---new-best-practice-side-nav-end2end 2024-10-31 09:54:34 -07:00
Alex Janousek
60e9ac18f5 Merge pull request #1949 from GSA/1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in
New guidance and subpages, and return to previous pages.
2024-10-31 12:49:47 -04:00
Beverly Nguyen
0bb0d3c24d e2e best practice 2024-10-30 21:08:45 -07:00
Beverly Nguyen
cf60dd7078 e2e best practice 2024-10-30 21:04:03 -07:00
Carlo Costino
1933dad137 Merge pull request #2063 from GSA/API-1328_Logging_Formatter_With_Scrub
API-1328 - Using a custom formatter to scrub PII from all log records.
2024-10-30 13:45:47 -04:00
Cliff Hill
278541fa5b Compiling email regex
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-30 11:44:39 -04:00
Cliff Hill
452ab7eb86 Fixing dependency error.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-30 09:36:22 -04:00
Cliff Hill
005e97f034 Using re.compile().
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-30 09:09:53 -04:00
Beverly Nguyen
4700534155 removed js from gulp 2024-10-29 20:33:56 -07:00
Beverly Nguyen
02e3efd105 adjusted subnav to hover 2024-10-29 20:19:51 -07:00
dependabot[bot]
4de7b5a5ec Bump rollup from 4.24.0 to 4.24.3
Bumps [rollup](https://github.com/rollup/rollup) from 4.24.0 to 4.24.3.
- [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.24.0...v4.24.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-29 23:41:33 +00:00
dependabot[bot]
77716e254e Bump sass-embedded from 1.80.4 to 1.80.5
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.80.4 to 1.80.5.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.80.4...1.80.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-29 23:41:21 +00:00
alexjanousekGSA
fd68a918e7 Updated feature flagging readme 2024-10-29 15:53:43 -04:00
Kenneth Kehl
64b979c0f7 Merge pull request #2005 from GSA/notify-admin-2001
fix moderate accessibility violation scope='row'
2024-10-29 12:38:07 -07:00
alexjanousekGSA
b806fd5eec Updated code based on comments 2024-10-29 15:28:07 -04:00
Beverly Nguyen
7ed04c82d6 removed feature flag content 2024-10-28 13:43:53 -07:00
Beverly Nguyen
a601906ef5 fixed a11y 2024-10-28 13:11:29 -07:00
Andrew Shumway
b352a13328 Merge pull request #2067 from GSA/dependabot/pip/werkzeug-3.0.6
Bump werkzeug from 3.0.3 to 3.0.6
2024-10-28 13:58:19 -06:00
alexjanousekGSA
d7db335a99 Updated depedency 2024-10-28 11:49:24 -04:00
alexjanousekGSA
94f90454e3 Linting issue addressed 2024-10-28 11:13:02 -04:00
alexjanousekGSA
de02780bd8 Added back tests that were removed 2024-10-28 11:07:48 -04:00
dependabot[bot]
70c95cdeb6 Bump werkzeug from 3.0.3 to 3.0.6
Bumps [werkzeug](https://github.com/pallets/werkzeug) from 3.0.3 to 3.0.6.
- [Release notes](https://github.com/pallets/werkzeug/releases)
- [Changelog](https://github.com/pallets/werkzeug/blob/main/CHANGES.rst)
- [Commits](https://github.com/pallets/werkzeug/compare/3.0.3...3.0.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-26 00:08:52 +00:00
Beverly Nguyen
a11bd0e344 removed pdf test 2024-10-25 13:33:08 -07:00
Beverly Nguyen
822682f256 fixed test failures 2024-10-25 13:23:58 -07:00
Beverly Nguyen
6a6a54e889 fixed test failures 2024-10-25 13:16:07 -07:00
Beverly Nguyen
bdb3e777c5 adjust settimeout 2024-10-25 11:20:41 -07:00
Beverly Nguyen
cf3c7be9bf pdf added 2024-10-25 11:00:51 -07:00
Beverly Nguyen
d8ae3f3056 pdf added 2024-10-25 10:59:55 -07:00
alexjanousekGSA
96a8ccc64a More linting 2024-10-25 11:35:56 -04:00
alexjanousekGSA
ccdf9f16d8 fixing lint errors, added another test 2024-10-25 11:29:07 -04:00
dependabot[bot]
b4f4e19665 Bump @babel/core from 7.25.8 to 7.26.0
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.25.8 to 7.26.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.0/packages/babel-core)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-25 14:59:28 +00:00
Alex Janousek
1f1f8bcd75 Merge pull request #2060 from GSA/dependabot/npm_and_yarn/babel/preset-env-7.25.9
Bump @babel/preset-env from 7.25.8 to 7.25.9
2024-10-25 10:58:24 -04:00
Alex Janousek
e4445b097e Merge pull request #2062 from GSA/dependabot/npm_and_yarn/sass-embedded-1.80.4
Bump sass-embedded from 1.80.3 to 1.80.4
2024-10-25 10:58:10 -04:00
alexjanousekGSA
09f400ad8e Merge branch '1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in' of https://github.com/GSA/notifications-admin into 1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in 2024-10-25 10:57:40 -04:00
alexjanousekGSA
01f1175e52 Added back removed tests 2024-10-25 10:57:34 -04:00
Beverly Nguyen
12b2d0d86d isort 2024-10-24 17:43:10 -07:00
Beverly Nguyen
2bbc58c8af changed guidanced to best practices 2024-10-24 17:03:45 -07:00
Beverly Nguyen
4b85ae6493 remove files not needed 2024-10-24 16:39:48 -07:00
Beverly Nguyen
3010ae1d9e changed guidance to best practices 2024-10-24 16:30:15 -07:00
alexjanousekGSA
cf4ac930c5 Merge branch 'main' into 1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in 2024-10-24 17:58:48 -04:00
alexjanousekGSA
09896b98cd Merge branch '1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in' of https://github.com/GSA/notifications-admin into 1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in 2024-10-24 17:58:28 -04:00
alexjanousekGSA
14880bf7ee Fixed one test 2024-10-24 17:58:23 -04:00
Sheev Davé
846b5b51e7 Merge pull request #2012 from GSA/1999-dashboard-a11y-fixes
1999 dashboard a11y fixes
2024-10-24 14:07:10 -07:00
Beverly Nguyen
00ad7b7581 updated content from feedback 2024-10-24 13:57:01 -07:00
alexjanousekGSA
e64ba86a2b Enabled new feature in demo 2024-10-24 13:02:44 -04:00
alexjanousekGSA
4dd8b578a9 Toggled guidance feature off from staging 2024-10-24 12:38:22 -04:00
Cliff Hill
a9948131cc Scrubbing log records with the formatter.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-24 12:35:40 -04:00
Cliff Hill
543239d078 Reversing accidental commit.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-24 12:32:26 -04:00
Cliff Hill
e6c0f045a5 Added PII scrub for all logging through the formatter.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-24 12:23:32 -04:00
alexjanousekGSA
1b18b4c146 Merge branch '1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in' of https://github.com/GSA/notifications-admin into 1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in 2024-10-24 11:54:26 -04:00
alexjanousekGSA
661d9b5517 Added feature flagging document 2024-10-24 11:54:21 -04:00
Carlo Costino
a349fb82dc Merge pull request #2004 from GSA/notify-admin-2003
Users can be invited with no permissions
2024-10-24 09:57:07 -04:00
Carlo Costino
a715b33fd0 Merge pull request #2053 from GSA/notify-admin-2037
remove permission to manage API integration
2024-10-24 09:49:21 -04:00
Carlo Costino
9ce00acec3 Merge pull request #2024 from GSA/USN-COMPLY-50-Verify_Nonce_for_Invite
US-NOTIFY-COMPLY 50: Verify Nonce For Invite
2024-10-24 09:36:58 -04:00
dependabot[bot]
353e2bb9a6 Bump sass-embedded from 1.80.3 to 1.80.4
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.80.3 to 1.80.4.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.80.3...1.80.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-23 23:58:09 +00:00
Beverly Nguyen
c0d05c99a2 testing errors 2024-10-23 10:09:47 -07:00
dependabot[bot]
c95e949856 Bump @babel/preset-env from 7.25.8 to 7.25.9
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.25.8 to 7.25.9.
- [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.25.9/packages/babel-preset-env)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 23:50:01 +00:00
Beverly Nguyen
ff4380b5a0 fixed testing 2024-10-22 16:48:07 -07:00
Beverly Nguyen
f2ea113856 subnav 2024-10-22 16:41:41 -07:00
Andrew Shumway
f4b6ca4a79 Merge pull request #2054 from GSA/dependabot/pip/coverage-7.6.4
Bump coverage from 7.6.0 to 7.6.4
2024-10-22 14:15:00 -06:00
Cliff Hill
341e5d4cb2 Removed logging.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-22 14:51:09 -04:00
alexjanousekGSA
4f802587b9 Fixing linting errors 2024-10-22 12:20:35 -04:00
Alex Janousek
3013d27d7c Merge pull request #2055 from GSA/dependabot/npm_and_yarn/sass-embedded-1.80.3
Bump sass-embedded from 1.79.5 to 1.80.3
2024-10-22 10:27:05 -04:00
dependabot[bot]
17e12495dd Bump sass-embedded from 1.79.5 to 1.80.3
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.79.5 to 1.80.3.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.79.5...1.80.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 23:55:37 +00:00
dependabot[bot]
35d95e4f5c Bump coverage from 7.6.0 to 7.6.4
Bumps [coverage](https://github.com/nedbat/coveragepy) from 7.6.0 to 7.6.4.
- [Release notes](https://github.com/nedbat/coveragepy/releases)
- [Changelog](https://github.com/nedbat/coveragepy/blob/master/CHANGES.rst)
- [Commits](https://github.com/nedbat/coveragepy/compare/7.6.0...7.6.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 23:44:06 +00:00
Cliff Hill
e04adba4fd Test written for get_id_token.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-21 16:41:50 -04:00
Cliff Hill
866a4ad7bd Got the unit test to be fixed, still figuring out a new test for the new
function.

Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-21 16:41:49 -04:00
Cliff Hill
579a65c92d Removed defunct imports.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-21 16:41:49 -04:00
Cliff Hill
7275dac6a0 black, isort, and flake8.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-21 16:41:49 -04:00
Cliff Hill
8c40538334 Nonce is working now for invites.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-21 16:41:49 -04:00
Cliff Hill
da6882774b Getting the redis stuff configured correctly.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-21 16:41:49 -04:00
Cliff Hill
d0cda995cf Standardising nonce storage/retrieval through redis for both login and
invite.

Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-21 16:41:49 -04:00
Cliff Hill
82cef7dbd3 Nonce stuff added.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-10-21 16:41:33 -04:00
Kenneth Kehl
e2020c188a remove permsision to manage API integration 2024-10-21 12:38:08 -07:00
Kenneth Kehl
7db678ddec remove permsision to manage API integration 2024-10-21 12:27:44 -07:00
Beverly Nguyen
7775508c97 fixed testing 2024-10-21 10:45:08 -07:00
Kenneth Kehl
3601b16c7b Merge pull request #2049 from GSA/nonce_nonce_nonce
comment out check for now
2024-10-18 10:24:44 -07:00
Kenneth Kehl
eaed2fc879 comment out check for now 2024-10-18 07:23:19 -07:00
Alex Janousek
00f63aed23 Merge pull request #2033 from GSA/dependabot/npm_and_yarn/rollup/plugin-commonjs-28.0.1
Bump @rollup/plugin-commonjs from 28.0.0 to 28.0.1
2024-10-17 15:10:10 -04:00
Carlo Costino
185f00cd01 Merge pull request #2025 from GSA/notify-compliance-52
investigate security.txt
2024-10-17 14:51:00 -04:00
alexjanousekGSA
088c2244a3 Merge branch '1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in' of https://github.com/GSA/notifications-admin into 1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in 2024-10-17 14:48:10 -04:00
alexjanousekGSA
93bc3792be Added feature flagging to each environment yml 2024-10-17 14:48:02 -04:00
Alex Janousek
417fac6dd1 Merge branch 'main' into 1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in 2024-10-17 13:17:18 -04:00
alexjanousekGSA
4b62d0e685 Added command variable from env ymls to manifest 2024-10-17 13:16:39 -04:00
Alex Janousek
149065576f Merge pull request #2034 from GSA/dependabot/npm_and_yarn/playwright-1.48.1
Bump playwright from 1.48.0 to 1.48.1
2024-10-17 13:11:08 -04:00
alexjanousekGSA
4eed138dc6 Merge branch '1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in' of https://github.com/GSA/notifications-admin into 1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in 2024-10-17 13:10:40 -04:00
alexjanousekGSA
7e505f7fda Updated sandbox and environment yamls 2024-10-17 13:09:58 -04:00
dependabot[bot]
4973cb84b1 Bump playwright from 1.48.0 to 1.48.1
Bumps [playwright](https://github.com/microsoft/playwright) from 1.48.0 to 1.48.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.48.0...v1.48.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-16 23:18:40 +00:00
dependabot[bot]
c2ea4684f6 Bump @rollup/plugin-commonjs from 28.0.0 to 28.0.1
Bumps [@rollup/plugin-commonjs](https://github.com/rollup/plugins/tree/HEAD/packages/commonjs) from 28.0.0 to 28.0.1.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/commonjs/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/commonjs-v28.0.1/packages/commonjs)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-16 23:18:17 +00:00
Carlo Costino
ca60eb03c0 Merge pull request #2030 from GSA/fix-deploy-actions
Fix demo and prod deploy actions
2024-10-16 14:36:23 -04:00
Carlo Costino
a3c021b154 Fix demo and prod deploy actions
This changeset makes a couple of more adjustments to the prod and demo deploy actions to make sure they are in sync with staging and work.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-16 14:26:02 -04:00
Carlo Costino
31076781a3 Merge pull request #2027 from GSA/fix-deploy-actions
Fix the prod and demo deployment actions
2024-10-16 13:11:16 -04:00
Carlo Costino
e54d18170e Add missing env var
Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-16 13:03:35 -04:00
Alex Janousek
c3f4482677 Merge pull request #2009 from GSA/dependabot/npm_and_yarn/uswds/uswds-3.9.0
Bump @uswds/uswds from 3.8.2 to 3.9.0
2024-10-16 12:50:18 -04:00
Alex Janousek
0183f37c7b Merge pull request #2022 from GSA/dependabot/npm_and_yarn/sass-embedded-1.79.5
Bump sass-embedded from 1.79.4 to 1.79.5
2024-10-16 12:49:58 -04:00
Carlo Costino
fc6adc6771 Fix the prod and demo deployment actions
This changeset fixes the prod and deployment actions so they have the correct environment variables.  It also fixes the egress proxy deploy config for each.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-16 12:44:55 -04:00
Kenneth Kehl
1dbb369143 fix test 2024-10-16 08:38:12 -07:00
Kenneth Kehl
f32845752a update email address 2024-10-16 08:18:19 -07:00
Kenneth Kehl
ae0f8d58d9 investigate security.txt 2024-10-16 07:48:00 -07:00
Beverly Nguyen
90e8017cd5 remove photos and edit content 2024-10-15 10:15:08 -07:00
Kenneth Kehl
34ccfb5bd7 Merge pull request #1996 from GSA/e2e_tests_uncomment
Make e2e tests work fully with staging API
2024-10-15 09:57:19 -07:00
alexjanousekGSA
2504e58a87 Fixed linting errors 2024-10-15 12:54:37 -04:00
dependabot[bot]
db5626f5b0 Bump sass-embedded from 1.79.4 to 1.79.5
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.79.4 to 1.79.5.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.79.4...1.79.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-14 23:36:07 +00:00
alexjanousekGSA
e62cc021e9 Added code for hiding guidance pages and updated backstop reference files 2024-10-14 14:44:20 -04:00
Alex Janousek
2624bd885d Merge pull request #2019 from GSA/dependabot/npm_and_yarn/babel/core-7.25.8
Bump @babel/core from 7.25.2 to 7.25.8
2024-10-14 13:53:01 -04:00
Alex Janousek
a5ff9af1eb Merge pull request #2011 from GSA/dependabot/npm_and_yarn/playwright-1.48.0
Bump playwright from 1.47.2 to 1.48.0
2024-10-14 13:44:34 -04:00
dependabot[bot]
8e29229d8b Bump @babel/core from 7.25.2 to 7.25.8
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.25.2 to 7.25.8.
- [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.25.8/packages/babel-core)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-14 17:39:42 +00:00
Alex Janousek
c30dbec6ce Merge pull request #2020 from GSA/dependabot/npm_and_yarn/babel/preset-env-7.25.8
Bump @babel/preset-env from 7.25.7 to 7.25.8
2024-10-14 13:38:24 -04:00
Jonathan Bobel
bfead7ffac Merge branch 'main' of https://github.com/GSA/notifications-admin into 1999-dashboard-a11y-fixes 2024-10-11 10:22:14 -04:00
dependabot[bot]
29854c6164 Bump @babel/preset-env from 7.25.7 to 7.25.8
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.25.7 to 7.25.8.
- [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.25.8/packages/babel-preset-env)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-10 23:19:49 +00:00
Carlo Costino
978031744f Merge pull request #2016 from GSA/use-the-correct-env-var-names
Use the correct environment variable names
2024-10-10 14:20:16 -04:00
Carlo Costino
f27703112a Use the correct environment variable names
This changeset corrects the reference to the environment names that we are actually trying to reference.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-10 13:06:47 -04:00
alexjanousekGSA
035c4158f9 Added new reference files 2024-10-10 11:29:20 -04:00
Carlo Costino
c47144a8b0 Merge pull request #2014 from GSA/swap-egress-proxy-config-to-env
Swap out config variables for env variables
2024-10-10 10:33:18 -04:00
alexjanousekGSA
54d5ee96d0 Merge branch 'main' into 1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in 2024-10-10 09:47:04 -04:00
Carlo Costino
fd447e9a75 Swap out config variables for env variables
This changeset swaps the CF_USERNAME and CF_PASSWORD config vars to be proper env vars so they can be read in as expected.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-09 14:20:10 -06:00
Carlo Costino
9ee0da0b32 Merge pull request #2013 from GSA/add-missing-egress-proxy-inputs
Add missing inputs to egress proxy deploy action
2024-10-09 14:00:27 -06:00
Carlo Costino
2fbce24f97 Add missing inputs to egress proxy deploy action
This changeset adds a few missing inputs to the egress proxy deploy action so that it can use the provided environment variables properly.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-09 13:48:47 -06:00
Carlo Costino
10da94dbf8 Merge pull request #1997 from GSA/update-egress-proxy-even-more
Add missing environment veriables to egress deploy action
2024-10-09 13:24:56 -06:00
Kenneth Kehl
d86b1afb9a code review feedback 2024-10-09 11:42:20 -07:00
Beverly Nguyen
34f133cf62 Merge branch 'main' into 1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in 2024-10-09 11:21:29 -07:00
Kenneth Kehl
10a8d1b938 code review feedback 2024-10-09 11:04:15 -07:00
Kenneth Kehl
b7b23ba6c8 try reverting hardcoding 2024-10-09 10:06:56 -07:00
Jonathan Bobel
a65f9f9bbf Updates to the js and tests 2024-10-09 12:46:19 -04:00
Kenneth Kehl
1cc760c153 write a script to get the VCAP value 2024-10-09 09:43:48 -07:00
Jonathan Bobel
175a47310e Adding the correct ID to the popup to read correctly to screen readers 2024-10-09 11:20:43 -04:00
Jonathan Bobel
77f96e901b Merge branch 'main' of https://github.com/GSA/notifications-admin into 1999-dashboard-a11y-fixes 2024-10-09 10:27:20 -04:00
Steven Reilly
338fbfc407 Merge pull request #2008 from GSA/2007-bug-total-messages-sms-sent-always-zero
2007 - bug - total messages sms sent always zero
2024-10-09 10:26:20 -04:00
Jonathan Bobel
5adcfae5d8 Fixing a test 2024-10-09 09:56:19 -04:00
dependabot[bot]
b8b4a707a3 Bump playwright from 1.47.2 to 1.48.0
Bumps [playwright](https://github.com/microsoft/playwright) from 1.47.2 to 1.48.0.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.47.2...v1.48.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 23:37:52 +00:00
dependabot[bot]
61ea8e0b03 Bump @uswds/uswds from 3.8.2 to 3.9.0
Bumps [@uswds/uswds](https://github.com/uswds/uswds) from 3.8.2 to 3.9.0.
- [Release notes](https://github.com/uswds/uswds/releases)
- [Commits](https://github.com/uswds/uswds/compare/v3.8.2...v3.9.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-08 23:37:27 +00:00
Beverly Nguyen
edca721f5b content updates vs 2 2024-10-08 15:32:11 -07:00
Jonathan Bobel
3ad6f9daae Removing reference to financial year 2024-10-08 16:37:33 -04:00
Jonathan Bobel
947f85ba51 This was from a previous commit 2024-10-08 16:24:03 -04:00
Jonathan Bobel
65c99bf8e8 Removing instances of a financial year 2024-10-08 16:12:50 -04:00
Jonathan Bobel
d8feea6bd5 Merge branch 'main' of https://github.com/GSA/notifications-admin 2024-10-08 16:06:19 -04:00
Jonathan Bobel
98fb68ad14 Updated to table captions and hiding the legend on the dashboard if it's empty 2024-10-08 16:05:00 -04:00
Beverly Nguyen
6213a9bc96 font changes 2024-10-08 11:34:46 -07:00
Kenneth Kehl
9c59e40de7 fix moderate accessibility violation scope='row' 2024-10-08 11:32:55 -07:00
Alex Janousek
c89a6089a0 Merge pull request #1984 from GSA/dependabot/npm_and_yarn/babel/preset-env-7.25.7
Bump @babel/preset-env from 7.25.4 to 7.25.7
2024-10-08 12:55:44 -04:00
Alex Janousek
971486be20 Merge pull request #1994 from GSA/dependabot/npm_and_yarn/multi-cf87d80143
Bump send and express
2024-10-08 12:55:18 -04:00
Alex Janousek
cd6c9af0bc Merge pull request #1983 from GSA/dependabot/npm_and_yarn/rollup-4.24.0
Bump rollup from 4.22.5 to 4.24.0
2024-10-08 12:54:04 -04:00
Alex Janousek
7eb7ed1855 Merge pull request #1977 from GSA/dependabot/npm_and_yarn/sass-embedded-1.79.4
Bump sass-embedded from 1.79.3 to 1.79.4
2024-10-08 12:53:35 -04:00
Alex Janousek
ea93b57190 Merge pull request #1960 from GSA/dependabot/npm_and_yarn/rollup/plugin-commonjs-28.0.0
Bump @rollup/plugin-commonjs from 26.0.1 to 28.0.0
2024-10-08 12:52:58 -04:00
Kenneth Kehl
8df380ca0d Users can be invited with no permissions 2024-10-08 08:32:20 -07:00
Jonathan Bobel
3865c5b952 Update to address a11y issue of "Broken Aria link" in the dialog 2024-10-08 10:36:35 -04:00
Kenneth Kehl
f37b89849e cleanup 2024-10-07 13:44:43 -07:00
Kenneth Kehl
397bbeabde Merge pull request #2000 from GSA/stvnrlly-patch-1
Update notify-pilot-info.md
2024-10-07 13:42:33 -07:00
Kenneth Kehl
a11c567de3 fix moderate axe-core accessibility violation 2024-10-07 11:45:14 -07:00
Steven Reilly
bdc27c10d0 Update notify-pilot-info.md 2024-10-07 14:40:50 -04:00
Kenneth Kehl
f7f449ff07 try h2 2024-10-07 11:31:02 -07:00
Kenneth Kehl
b133def7fc cleanup 2024-10-07 11:02:04 -07:00
Kenneth Kehl
b4b15bc209 cleanup 2024-10-07 10:45:02 -07:00
Kenneth Kehl
44524eb9e2 try to not put vcap services into a secret 2024-10-07 10:26:43 -07:00
Kenneth Kehl
4b8b078476 try to not put vcap services into a secret 2024-10-07 10:03:45 -07:00
Kenneth Kehl
22f9ff603a try using h3 instead of h4 2024-10-07 09:11:10 -07:00
Kenneth Kehl
3f7e600ac1 try using h3 instead of h4 2024-10-07 08:37:34 -07:00
Kenneth Kehl
5a5b0649e0 restore axe_core level to minor 2024-10-07 08:23:18 -07:00
Kenneth Kehl
a23fe5c046 relax axe-core tests for now 2024-10-07 08:03:51 -07:00
Kenneth Kehl
306391c958 relax axe-core tests for now 2024-10-07 07:54:14 -07:00
Kenneth Kehl
e41ad9fab9 update secrets 2024-10-07 07:47:30 -07:00
Kenneth Kehl
fb83e8610c update secrets 2024-10-07 07:33:40 -07:00
Carlo Costino
d0a435becd Merge pull request #1978 from GSA/1971-bug-two-skip-links
1971 - BUG - There were two main content skip links
2024-10-05 15:47:58 -06:00
Carlo Costino
62f58c6e27 Merge pull request #1981 from GSA/1967-remove-uk-reference
1967 - Remove reference to UK on error page
2024-10-05 15:39:43 -06:00
Carlo Costino
0db68453b9 Merge pull request #1987 from GSA/1986-go-live-form-link-change
1986 - Updated links for Go Live Form
2024-10-05 15:29:10 -06:00
Carlo Costino
fbba1a735f Merge pull request #1992 from GSA/change-deploytools-demoprod
Switch out deprecated tools in demo/prod deploy scripts
2024-10-05 15:22:11 -06:00
Carlo Costino
35eb2a9013 Add missing environment veriables to egress deploy action
This changeset adds missing environment variables needed by the egress proxy to now properly deploy.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-04 22:49:42 -04:00
Kenneth Kehl
108e93d06a update secrets 2024-10-04 15:44:08 -07:00
Kenneth Kehl
4d4288d3c7 try again 2024-10-04 15:20:30 -07:00
Kenneth Kehl
c0ffa63f88 try again 2024-10-04 15:14:45 -07:00
Kenneth Kehl
89413c56ba try again 2024-10-04 15:04:34 -07:00
Kenneth Kehl
e6a3c0d4b7 try again 2024-10-04 14:52:58 -07:00
Kenneth Kehl
7d2f7d1c8a try again 2024-10-04 14:37:52 -07:00
Kenneth Kehl
f118b1c4bf try again 2024-10-04 14:28:12 -07:00
Kenneth Kehl
85a5e3075a try again 2024-10-04 14:18:48 -07:00
Kenneth Kehl
59959cfab4 try again 2024-10-04 14:09:39 -07:00
Kenneth Kehl
68cf422ca8 try again 2024-10-04 13:23:23 -07:00
Kenneth Kehl
a9999aa8ec try again 2024-10-04 13:18:15 -07:00
Kenneth Kehl
3a50fff6ea try again 2024-10-04 13:08:36 -07:00
Kenneth Kehl
c15d388fc2 try again 2024-10-04 13:00:31 -07:00
Kenneth Kehl
ec3ebe5b90 try again 2024-10-04 12:32:04 -07:00
Beverly Nguyen
fbdc01b109 Merge pull request #1995 from GSA/update-egress-proxy-more
Add one more potentially missing step
2024-10-04 12:29:08 -07:00
Kenneth Kehl
60e3c5291e try again 2024-10-04 12:18:46 -07:00
Carlo Costino
c178a3e77e Add one more potentially missing step
This changeset adds one more step that hopefully takes care of the egress proxy deploy.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-04 15:16:16 -04:00
Kenneth Kehl
4e3eb03040 try again 2024-10-04 12:10:16 -07:00
Carlo Costino
29b9e122ba Merge pull request #1993 from GSA/update-egress-proxy
Update cg-egress-proxy installation
2024-10-04 14:57:56 -04:00
dependabot[bot]
63c1652c40 Bump sass-embedded from 1.79.3 to 1.79.4
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.79.3 to 1.79.4.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.79.3...1.79.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-04 18:48:30 +00:00
dependabot[bot]
f28a618e78 Bump @babel/preset-env from 7.25.4 to 7.25.7
Bumps [@babel/preset-env](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-env) from 7.25.4 to 7.25.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.25.7/packages/babel-preset-env)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-04 18:48:27 +00:00
dependabot[bot]
aa7c7b7d9a Bump rollup from 4.22.5 to 4.24.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.22.5 to 4.24.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.22.5...v4.24.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-04 18:48:26 +00:00
dependabot[bot]
4c0221e295 Bump @rollup/plugin-commonjs from 26.0.1 to 28.0.0
Bumps [@rollup/plugin-commonjs](https://github.com/rollup/plugins/tree/HEAD/packages/commonjs) from 26.0.1 to 28.0.0.
- [Changelog](https://github.com/rollup/plugins/blob/master/packages/commonjs/CHANGELOG.md)
- [Commits](https://github.com/rollup/plugins/commits/commonjs-v28.0.0/packages/commonjs)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-04 18:48:20 +00:00
dependabot[bot]
21d1b69c22 Bump send and express
Bumps [send](https://github.com/pillarjs/send) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `send` from 0.18.0 to 0.19.0
- [Release notes](https://github.com/pillarjs/send/releases)
- [Changelog](https://github.com/pillarjs/send/blob/master/HISTORY.md)
- [Commits](https://github.com/pillarjs/send/compare/0.18.0...0.19.0)

Updates `express` from 4.20.0 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.20.0...4.21.0)

---
updated-dependencies:
- dependency-name: send
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-04 18:48:06 +00:00
Alex Janousek
5aac3130b3 Merge pull request #1950 from GSA/1927-user-story-brief-description-of-the-user-story
Backstop is implemented locally
2024-10-04 14:47:06 -04:00
Carlo Costino
75ce12f5da Update cg-egress-proxy installation
This changeset updates the installation of the cg-egress-proxy repo on account of the recent change to use the newer cg-cli-tools.  It also forces the update for staging to test this out for now; we will have to uncomment the check once this is working.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-04 14:41:26 -04:00
Kenneth Kehl
21bd20f607 try again 2024-10-04 11:32:16 -07:00
Andrew Shumway
371eb58392 Remove duplicate code in reference 2024-10-04 12:08:45 -06:00
Kenneth Kehl
a27b9a701b try again 2024-10-04 11:08:15 -07:00
Andrew Shumway
c328044636 Switch out deprecated tools in demo/prod deploy scripts 2024-10-04 12:03:16 -06:00
Kenneth Kehl
77f44d4d5e try again 2024-10-04 11:02:52 -07:00
alexjanousekGSA
73b3a61746 Moved condition back to top of method 2024-10-04 13:49:10 -04:00
alexjanousekGSA
c5b2535b8e Fixed calling of response.json() 2024-10-04 13:38:13 -04:00
Carlo Costino
9449b80975 Merge pull request #1991 from GSA/remove-extra-login-env-var
Remove an extra Login.gov environment variable
2024-10-04 13:01:49 -04:00
Kenneth Kehl
cc3d70303c add vcap secret 2024-10-04 09:57:15 -07:00
Carlo Costino
ef528360be Undo change to the cloud.gov repo
They reverted the repo name change

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-04 12:54:19 -04:00
Carlo Costino
ae1a51ff79 Update reference to the renaming of the cloud-gov/cli-tools repo
Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-04 12:14:07 -04:00
Carlo Costino
e9b364010a Remove an extra Login.gov environment variable
This changeset removes the LOGIN_DOT_GOV_REGISTRATION_URL environment variable from the admin app deployment configuration.  This is only needed for the API.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-04 11:33:40 -04:00
Carlo Costino
a8bf2414b4 Merge pull request #1990 from GSA/remove-e2e-env-vars-from-deploy
Remove E2E env vars from deploy
2024-10-04 11:11:54 -04:00
Kenneth Kehl
ced229167f add vcap secret 2024-10-04 08:04:41 -07:00
alexjanousekGSA
8deed320f8 Tweaked mismatch percentage 2024-10-04 11:02:39 -04:00
Kenneth Kehl
114814b0b5 add vcap secret 2024-10-04 07:50:34 -07:00
Kenneth Kehl
88262302e6 add VCAP_SERVICES 2024-10-04 07:06:35 -07:00
Carlo Costino
2e8f82be3b Remove E2E env vars from deploy
The E2E environment variables should not be included with our deploys because we do not want to enable or run E2E tests in production or production-like environments.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-10-04 08:35:35 -04:00
Carlo Costino
d63cfb3cb0 Merge pull request #1988 from GSA/switch-18f-deploy-tool-to-CG
Switch 18f deploy tool to CG
2024-10-04 08:06:11 -04:00
Andrew Shumway
6980e28786 Switch 18f deploy tool to CG 2024-10-03 14:19:09 -06:00
Andrew Shumway
c9acf937cf Merge pull request #1975 from GSA/fix-cfcommand-deploytool
Fix cf_command argument for deploy tool
2024-10-03 14:05:13 -06:00
Kenneth Kehl
37bb89402e add VCAP_SERVICES 2024-10-03 12:09:15 -07:00
Kenneth Kehl
f20803ecae add VCAP_SERVICES 2024-10-03 12:04:50 -07:00
Kenneth Kehl
addf4f0959 add VCAP_SERVICES 2024-10-03 12:00:31 -07:00
Kenneth Kehl
b7f26454ff add VCAP_SERVICES 2024-10-03 11:53:11 -07:00
Kenneth Kehl
a669477f48 add VCAP_SERVICES 2024-10-03 11:49:42 -07:00
Jonathan Bobel
8c932a6072 Updated links for Go Live Form 2024-10-03 14:39:51 -04:00
Kenneth Kehl
d2c654214b add VCAP_SERVICES 2024-10-03 11:28:12 -07:00
Kenneth Kehl
3120f82b1e add VCAP_SERVICES 2024-10-03 11:09:17 -07:00
Kenneth Kehl
0e45588e5a add VCAP_SERVICES 2024-10-03 10:52:49 -07:00
Kenneth Kehl
d4223429ec merge from main 2024-10-03 10:49:56 -07:00
Jonathan Bobel
1ea15d5ba1 Updated text for this error page (although I don't know when someone would see it) 2024-10-02 16:02:18 -04:00
Kenneth Kehl
915b18bbbd Merge pull request #1970 from GSA/notify-api-1299
optimize S3 partitioning
2024-10-02 09:55:14 -07:00
Beverly Nguyen
cecfeb7441 revised content phone content 2024-10-02 09:52:44 -07:00
alexjanousekGSA
f2fc6da0ee Updated docs 2024-10-02 11:19:33 -04:00
alexjanousekGSA
e96aec9898 Merged in main, created reference images and added delay to screenshots 2024-10-02 11:16:30 -04:00
alexjanousekGSA
e11b6376c2 Redid reference files 2024-10-02 10:37:04 -04:00
Andrew Shumway
4e2630d675 Remove whitespace/fix caps on var 2024-10-02 08:18:47 -06:00
Andrew Shumway
0a5ca7d0d6 Pull in main/fix merge conflicts 2024-10-02 07:58:04 -06:00
Andrew Shumway
64a01e70b7 Wrap vars with quotes and indent 2024-10-02 07:55:58 -06:00
Beverly Nguyen
4eff686e17 revising stylnig 2024-10-01 12:38:01 -07:00
Beverly Nguyen
282e27034d revised content 2024-10-01 12:28:05 -07:00
Alex Janousek
466137ba07 Update docs/backstop.md
Co-authored-by: Carlo Costino <ccostino@users.noreply.github.com>
2024-10-01 12:13:35 -04:00
Carlo Costino
0d04524525 Merge pull request #1966 from GSA/USN-COMPLY-49_Verify_Nonce_on_Login
Verify NONCE on login.
2024-10-01 11:05:09 -04:00
Jonathan Bobel
08c97a8066 Removing this link since it was duplicated 2024-10-01 10:42:33 -04:00
Andrew Shumway
6815493f4a Remove brackets from hardcoded var 2024-09-30 14:49:28 -06:00
Andrew Shumway
f578a52010 Retry syntax on cf command 2024-09-30 14:34:47 -06:00
Carlo Costino
40a0418731 Merge pull request #1972 from GSA/dependabot/npm_and_yarn/rollup-4.22.5
Bump rollup from 4.22.4 to 4.22.5
2024-09-30 15:56:25 -04:00
Andrew Shumway
b7d699feae Move admin client username to env variable block 2024-09-30 13:46:13 -06:00
Andrew Shumway
8b9293db0e Fix cf_command syntax 2024-09-30 13:42:48 -06:00
Kenneth Kehl
6ff8be5d3e Merge pull request #1973 from GSA/add-awscli
Add awscli tools to the admin
2024-09-30 11:35:08 -07:00
Andrew Shumway
475bd0c1b4 fix yaml 2024-09-30 11:26:27 -06:00
Carlo Costino
2c7d090b82 Merge pull request #1964 from GSA/notify-admin-1956
make sure phone number is always last in the one-off csv
2024-09-30 13:03:09 -04:00
Carlo Costino
4f193e362c Add awscli tools to the admin
This changeset adds the awscli tools as a development dependency so that we are able to manage local connectivity to AWS resources when needed.  It is also needed to help with deploying the project to the sandbox environment and/or updating the Terraform to manage the infrastructure.

Signed-off-by: Carlo Costino <carlo.costino@gsa.gov>
2024-09-30 10:13:12 -04:00
alexjanousekGSA
687372fd6c Added new reference images, removed a few custom pages 2024-09-30 09:58:44 -04:00
dependabot[bot]
302a79b41f Bump rollup from 4.22.4 to 4.22.5
Bumps [rollup](https://github.com/rollup/rollup) from 4.22.4 to 4.22.5.
- [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.22.4...v4.22.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-27 23:20:05 +00:00
Kenneth Kehl
f0299c4042 optimize S3 partitioning 2024-09-27 08:39:19 -07:00
Kenneth Kehl
bc5b980431 more debug 2024-09-27 07:49:15 -07:00
Kenneth Kehl
08384dd1fa more debug 2024-09-27 07:36:55 -07:00
Kenneth Kehl
bdc5614fff Update app/main/views/send.py
Co-authored-by: Carlo Costino <ccostino@users.noreply.github.com>
2024-09-27 07:20:40 -07:00
alexjanousekGSA
060db76640 Removed comment 2024-09-26 15:01:34 -04:00
alexjanousekGSA
b2b758ca8d Updated sensitivity 2024-09-26 14:54:55 -04:00
Kenneth Kehl
584ccce53d check bucket name 2024-09-26 10:51:51 -07:00
Kenneth Kehl
dda788b073 check bucket name 2024-09-26 10:46:26 -07:00
Kenneth Kehl
feff8ec1be try specifying region in the config 2024-09-26 10:32:22 -07:00
Kenneth Kehl
cfc9acc6f2 try specifying region in the config 2024-09-26 10:24:38 -07:00
Kenneth Kehl
959a680664 try specifying region in the config 2024-09-26 10:13:19 -07:00
Cliff Hill
a5e72ea4eb manifest.yml changed.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-09-26 12:46:07 -04:00
Kenneth Kehl
122343e46e try not using fips 2024-09-26 09:37:07 -07:00
Kenneth Kehl
86b217b1df remove extrtaneous comments 2024-09-26 09:22:16 -07:00
alexjanousekGSA
982f77413e updated mismatch threshold 2024-09-26 12:02:35 -04:00
Kenneth Kehl
3967612eb1 more debug 2024-09-26 08:53:40 -07:00
alexjanousekGSA
b0f0a8d8db Updated readme 2024-09-26 11:50:10 -04:00
Kenneth Kehl
fd2de9bf9b more debug 2024-09-26 08:44:10 -07:00
Kenneth Kehl
cd24c2b029 more debug 2024-09-26 08:23:13 -07:00
Cliff Hill
63747515db Updated the sample.env with new var.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-09-26 10:16:57 -04:00
Cliff Hill
55f588f13d Updated deploy workflows with new env var.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-09-26 10:11:46 -04:00
Cliff Hill
81a629935c Ok, now working 100% correctly with nonce.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-09-26 09:18:02 -04:00
Jonathan Bobel
49ec3dc559 Merge pull request #1963 from GSA/notify-admin-1937b
Fix moderate a11y violations reported by axe-core
2024-09-25 16:35:02 -04:00
Jonathan Bobel
647b37ae61 Removing moderate violations for the a11y scan 2024-09-25 16:19:00 -04:00
Cliff Hill
7b2d495c1b fixing so nonce check works correctly.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-09-25 16:01:13 -04:00
Cliff Hill
47f0952125 Getting id_token to decode correctly.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-09-25 15:34:31 -04:00
Jonathan Bobel
e0fb031cf5 Semantic update 2024-09-25 15:29:58 -04:00
Jonathan Bobel
72eff3235e Making sure it's testing against this code 2024-09-25 15:15:50 -04:00
Jonathan Bobel
67ad9148d6 Testing back button for a11y issues 2024-09-25 13:58:54 -04:00
alexjanousekGSA
2f40be8cd0 Added documentation 2024-09-25 13:12:18 -04:00
Beverly Nguyen
7d1c7fabc2 links fixed 2024-09-25 10:03:49 -07:00
Kenneth Kehl
a088409dfe fix 2024-09-25 09:54:31 -07:00
Kenneth Kehl
ddd413f299 fix 2024-09-25 09:38:59 -07:00
Beverly Nguyen
67097957f5 content 2024-09-25 09:38:21 -07:00
Kenneth Kehl
250a36836d fix 2024-09-25 09:29:50 -07:00
Kenneth Kehl
f8fd0422bf uncomment test code 2024-09-25 09:16:22 -07:00
Cliff Hill
4cdac9eba3 Making coverage not bother with sign in stuff since login.gov.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-09-25 12:05:56 -04:00
Cliff Hill
76863cd4dc Some unit test cleanup.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-09-25 11:23:36 -04:00
Cliff Hill
3d00b0c94f Making nonce passed through redis.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-09-25 10:45:57 -04:00
Kenneth Kehl
4594dc317f merge from main 2024-09-25 07:03:02 -07:00
Kenneth Kehl
5e93f2d572 merge from main 2024-09-25 07:00:10 -07:00
Cliff Hill
a2dbb6c9e6 Typo fix.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-09-24 20:46:48 -04:00
Cliff Hill
d097a0e2a6 I believe nonce is set up for sign_in.py.
Signed-off-by: Cliff Hill <clifford.hill@gsa.gov>
2024-09-24 20:39:08 -04:00
Beverly Nguyen
cff1fb8f2e guidance pages 2024-09-24 15:42:16 -07:00
Beverly Nguyen
5a1b59561f guidance content 2024-09-24 15:38:13 -07:00
Beverly Nguyen
1aad5f0ac1 merge main 2024-09-24 15:15:22 -07:00
Beverly Nguyen
d89fa8b987 Merge branch 'main' into 1928-develop-new-page-templates-in-code-to-sit-behind-the-log-in 2024-09-24 15:13:54 -07:00
Carlo Costino
d3855f47ac Merge pull request #1959 from GSA/dependabot/npm_and_yarn/rollup-4.22.4
Bump rollup from 4.22.2 to 4.22.4
2024-09-24 15:57:00 -04:00
Kenneth Kehl
6f91d60030 make sure phone number is always last in the one-off csv 2024-09-24 10:35:22 -07:00
Beverly Nguyen
9eb54bd837 updated 2024-09-24 10:07:18 -07:00
Beverly Nguyen
968f7881e7 fixed test 2024-09-24 10:01:56 -07:00
alexjanousekGSA
f4d8816eac Added updates 2024-09-24 12:19:20 -04:00
Kenneth Kehl
99ce42fc4a revert test setting to ignore moderate failures 2024-09-24 08:44:01 -07:00
Kenneth Kehl
899347d349 fix tests 2024-09-24 08:23:17 -07:00
Kenneth Kehl
14b37524ae revert to nav 2024-09-24 08:02:32 -07:00
Kenneth Kehl
5caa26e93c try adding service nav 2024-09-24 07:52:10 -07:00
Kenneth Kehl
5ee559da10 try adding service nav 2024-09-24 07:44:43 -07:00
Kenneth Kehl
73852a54f2 add aria-labels 2024-09-24 07:36:21 -07:00
Kenneth Kehl
ec806ce385 1937b 2024-09-24 07:11:08 -07:00
Beverly Nguyen
8eaaf1b067 fix test 2024-09-23 19:15:21 -07:00
Beverly Nguyen
296ebb5655 reverting index 2024-09-23 18:58:52 -07:00
Beverly Nguyen
d9805495de adjusting css margin and nav 2024-09-23 18:58:22 -07:00
dependabot[bot]
8c3cdabb92 Bump rollup from 4.22.2 to 4.22.4
Bumps [rollup](https://github.com/rollup/rollup) from 4.22.2 to 4.22.4.
- [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.22.2...v4.22.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-23 23:13:18 +00:00
alexjanousekGSA
4e52d60a7c Fixed linting issue 2024-09-23 13:53:08 -04:00
Jonathan Bobel
a5889d3448 Merge pull request #1957 from GSA/notify-admin-1936
Fix serious a11y violations reported by axe-core
2024-09-23 13:40:37 -04:00
alexjanousekGSA
5234706ae1 Added script 2024-09-23 13:08:29 -04:00
alexjanousekGSA
70c9801f1d Added script 2024-09-23 13:07:24 -04:00
alexjanousekGSA
df22530fa4 Remove BackstopJS generated folders from Git tracking 2024-09-23 12:03:21 -04:00
alexjanousekGSA
df630b58d8 Merge branch 'main' into 1927-user-story-brief-description-of-the-user-story 2024-09-23 11:57:37 -04:00
alexjanousekGSA
f9337b614f Reverted sign in 2024-09-23 11:57:13 -04:00
Carlo Costino
09a775fdad Merge pull request #1953 from GSA/dependabot/npm_and_yarn/sass-embedded-1.79.3
Bump sass-embedded from 1.78.0 to 1.79.3
2024-09-23 11:50:48 -04:00
Carlo Costino
62cfa2c39c Merge pull request #1954 from GSA/dependabot/npm_and_yarn/rollup-4.22.2
Bump rollup from 4.21.2 to 4.22.2
2024-09-23 11:43:42 -04:00
Kenneth Kehl
8b6f719510 try to fix li elements 2024-09-23 08:18:41 -07:00
Kenneth Kehl
b953d316c4 fix aria label issue 2024-09-23 08:01:56 -07:00
Kenneth Kehl
5c3b5790ae try overriding default govuk-frontend font weight 2024-09-23 07:50:52 -07:00
Carlo Costino
d0d3878881 Merge pull request #1931 from GSA/notify-admin-1926
Integrate axe-core a11y tests into our e2e tests
2024-09-23 10:26:44 -04:00
Kenneth Kehl
b6e0249adb merge from main 2024-09-23 07:10:31 -07:00
dependabot[bot]
4a8d768b6f Bump rollup from 4.21.2 to 4.22.2
Bumps [rollup](https://github.com/rollup/rollup) from 4.21.2 to 4.22.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.21.2...v4.22.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-20 23:34:39 +00:00
dependabot[bot]
876db282d5 Bump sass-embedded from 1.78.0 to 1.79.3
Bumps [sass-embedded](https://github.com/sass/embedded-host-node) from 1.78.0 to 1.79.3.
- [Changelog](https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/embedded-host-node/compare/1.78.0...1.79.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-20 23:34:30 +00:00
alexjanousekGSA
028423adc1 Fixinng linting issues 2024-09-19 16:54:15 -04:00
alexjanousekGSA
56f7ad47e5 Solved merge conflict 2024-09-19 16:11:43 -04:00
Beverly Nguyen
1368384fdf fixed testing 2024-09-19 13:04:33 -07:00
Beverly Nguyen
17c63c0790 fix sort 2024-09-19 09:55:59 -07:00
Beverly Nguyen
d21e85278e fixed flake8 2024-09-18 22:45:49 -07:00
Beverly Nguyen
a4b9c16763 added guidance directory and nav 2024-09-18 22:40:48 -07:00
alexjanousekGSA
c44084f325 Backstop is working locally 2024-09-18 13:59:16 -04:00
Kenneth Kehl
892705b125 revert fix for aria label 2024-09-11 14:19:31 -07:00
Kenneth Kehl
ef9e3aecbe set to critical for now 2024-09-11 14:11:19 -07:00
Kenneth Kehl
6da52f91b3 get list of serious violations 2024-09-11 14:01:57 -07:00
Kenneth Kehl
5eadcc0319 switch to serious and above try removing aria label 2024-09-11 13:54:42 -07:00
Kenneth Kehl
8d6478c3c1 switch to serious and above try removing aria label 2024-09-11 13:31:50 -07:00
Kenneth Kehl
a267cf3d4b expand to all tests 2024-09-11 13:16:58 -07:00
Kenneth Kehl
f82bcb0509 expand to all tests 2024-09-11 13:08:50 -07:00
Kenneth Kehl
c3a2441ade try expanding use of axe 2024-09-11 12:57:10 -07:00
Kenneth Kehl
8ef357ea61 try expanding use of axe 2024-09-11 12:36:58 -07:00
Kenneth Kehl
286166c2ad fix import 2024-09-11 11:07:59 -07:00
Kenneth Kehl
7b9e5288f8 fix import 2024-09-11 11:02:01 -07:00
Kenneth Kehl
df85f66a43 fix import 2024-09-11 10:48:26 -07:00
Kenneth Kehl
a91d6d25c8 initial test axe-core 2024-09-11 10:39:28 -07:00
194 changed files with 8809 additions and 4666 deletions

View File

@@ -133,7 +133,7 @@
"filename": ".github/workflows/checks.yml",
"hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8",
"is_verified": false,
"line_number": 66,
"line_number": 68,
"is_secret": false
}
],
@@ -161,7 +161,7 @@
"filename": "app/config.py",
"hashed_secret": "577a4c667e4af8682ca431857214b3a920883efc",
"is_verified": false,
"line_number": 118,
"line_number": 120,
"is_secret": false
}
],
@@ -425,7 +425,7 @@
"filename": "deploy-config/sandbox.yml",
"hashed_secret": "113151dd10316fcb0d5507b6215d78e2f3fe9e54",
"is_verified": false,
"line_number": 8,
"line_number": 9,
"is_secret": false
}
],
@@ -555,7 +555,7 @@
"filename": "tests/app/main/views/test_register.py",
"hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8",
"is_verified": false,
"line_number": 201,
"line_number": 199,
"is_secret": false
},
{
@@ -563,7 +563,7 @@
"filename": "tests/app/main/views/test_register.py",
"hashed_secret": "bb5b7caa27d005d38039e3797c3ddb9bcd22c3c8",
"is_verified": false,
"line_number": 274,
"line_number": 272,
"is_secret": false
}
],
@@ -684,5 +684,5 @@
}
]
},
"generated_at": "2024-09-03T17:36:57Z"
"generated_at": "2025-01-16T16:38:48Z"
}

View File

@@ -64,6 +64,17 @@ body:
validations:
required: false
- type: markdown
attributes:
value: '**Accessibility:**'
- type: textarea
id: notes
attributes:
label: "List any specific accessibility guidance or tests that need to be considered for this user story."
description: "List what type of accessibility tests need to pass."
validations:
required: false
- type: markdown
attributes:
value: '**Notes:**'

View File

@@ -1,6 +1,9 @@
name: Deploy egress proxy
description: Set egress space security groups and deploy proxy
inputs:
cf_org:
description: The org the target app exists in.
required: true
cf_space:
description: The space the target app exists in.
required: true
@@ -16,6 +19,19 @@ inputs:
runs:
using: composite
steps:
- name: Install cf-cli
shell: bash
run: |
curl -A "cg-deploy-action" -v -L -o cf-cli_amd64.deb 'https://packages.cloudfoundry.org/stable?release=debian64&version=v8&source=github'
sudo dpkg -i cf-cli_amd64.deb
- name: Login to cf-cli
shell: bash
run: |
cf api api.fr.cloud.gov
cf auth
- name: Target org and space
shell: bash
run: cf target -o ${{ inputs.cf_org }} -s ${{ inputs.cf_space }}
- name: Set restricted space egress
shell: bash
run: ./terraform/set_space_egress.sh -t -s ${{ inputs.cf_space }}

View File

@@ -15,7 +15,7 @@ runs:
python-version: "3.12.3"
- name: Install poetry
shell: bash
run: pip install poetry
run: pip install poetry==1.8.5
- name: Install application dependencies
shell: bash
run: make bootstrap

View File

@@ -20,3 +20,8 @@ Please enter a detailed description here.
* Consideration 1
* Consideration 2
* Consideration ...
## A11y Checks (if applicable)
* Conduct automated tests through [AxeDevTools](https://www.deque.com/axe/devtools/) and [WAVE](https://wave.webaim.org/)
* Review the [Manual Checklist](https://docs.google.com/document/d/192bBXStebdXWtYhZQ73qaWMJhGcuSB1W6c9YBXhWZvc/edit?usp=sharing)

View File

@@ -53,11 +53,13 @@ jobs:
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
@@ -97,13 +99,17 @@ jobs:
# 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
env:
API_HOST_NAME: https://notify-api-staging.app.cloud.gov/
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
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
@@ -111,7 +117,7 @@ jobs:
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
environment: staging
@@ -138,6 +144,7 @@ jobs:
inputs: requirements.txt
ignore-vulns: |
PYSEC-2024-60
PYSEC-2022-43162
- name: Run npm audit
run: make npm-audit

View File

@@ -47,11 +47,12 @@ jobs:
run: poetry export --without-hashes --format=requirements.txt > requirements.txt
- name: Deploy to cloud.gov
uses: 18f/cg-deploy-action@main
uses: cloud-gov/cg-cli-tools@main
env:
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
SECRET_KEY: ${{ secrets.SECRET_KEY }}
ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
ADMIN_CLIENT_USERNAME: "notify-admin"
NEW_RELIC_LICENSE_KEY: ${{ secrets.NEW_RELIC_LICENSE_KEY }}
NR_BROWSER_KEY: ${{ secrets.NR_BROWSER_KEY }}
COMMIT_HASH: ${{ github.sha }}
@@ -63,21 +64,22 @@ jobs:
LOGIN_DOT_GOV_BASE_LOGOUT_URL: "https://secure.login.gov/openid_connect/logout?"
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"
with:
cf_username: ${{ secrets.CLOUDGOV_USERNAME }}
cf_password: ${{ secrets.CLOUDGOV_PASSWORD }}
cf_org: gsa-tts-benefits-studio
cf_space: notify-demo
push_arguments: >-
cf_command: >-
push -f manifest.yml
--vars-file deploy-config/demo.yml
--var DANGEROUS_SALT="$DANGEROUS_SALT"
--var SECRET_KEY="$SECRET_KEY"
--var ADMIN_CLIENT_USERNAME="notify-admin"
--var ADMIN_CLIENT_SECRET="$ADMIN_CLIENT_SECRET"
--var ADMIN_CLIENT_USERNAME="$ADMIN_CLIENT_USERNAME"
--var NEW_RELIC_LICENSE_KEY="$NEW_RELIC_LICENSE_KEY"
--var NR_BROWSER_KEY="$NR_BROWSER_KEY"
--var COMMIT_HASH="$COMMIT_HASH"
--var LOGIN_PEM="$LOGIN_PEM"
--var LOGIN_DOT_GOV_CLIENT_ID="$LOGIN_DOT_GOV_CLIENT_ID"
--var LOGIN_DOT_GOV_USER_INFO_URL="$LOGIN_DOT_GOV_USER_INFO_URL"
--var LOGIN_DOT_GOV_ACCESS_TOKEN_URL="$LOGIN_DOT_GOV_ACCESS_TOKEN_URL"
@@ -85,6 +87,9 @@ jobs:
--var LOGIN_DOT_GOV_BASE_LOGOUT_URL="$LOGIN_DOT_GOV_BASE_LOGOUT_URL"
--var LOGIN_DOT_GOV_SIGNOUT_REDIRECT="$LOGIN_DOT_GOV_SIGNOUT_REDIRECT"
--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"
--strategy rolling
- name: Check for changes to egress config
id: changed-egress-config
@@ -97,6 +102,10 @@ jobs:
- name: Deploy egress proxy
if: steps.changed-egress-config.outputs.any_changed == 'true'
uses: ./.github/actions/deploy-proxy
env:
CF_USERNAME: ${{ secrets.CLOUDGOV_USERNAME }}
CF_PASSWORD: ${{ secrets.CLOUDGOV_PASSWORD }}
with:
cf_org: gsa-tts-benefits-studio
cf_space: notify-demo
app: notify-admin-demo

View File

@@ -47,11 +47,12 @@ jobs:
run: poetry export --without-hashes --format=requirements.txt > requirements.txt
- name: Deploy to cloud.gov
uses: 18f/cg-deploy-action@main
uses: cloud-gov/cg-cli-tools@main
env:
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
SECRET_KEY: ${{ secrets.SECRET_KEY }}
ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
ADMIN_CLIENT_USERNAME: "notify-admin"
NEW_RELIC_LICENSE_KEY: ${{ secrets.NEW_RELIC_LICENSE_KEY }}
NR_BROWSER_KEY: ${{ secrets.NR_BROWSER_KEY }}
COMMIT_HASH: ${{ github.sha }}
@@ -63,21 +64,22 @@ jobs:
LOGIN_DOT_GOV_BASE_LOGOUT_URL: "https://secure.login.gov/openid_connect/logout?"
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"
with:
cf_username: ${{ secrets.CLOUDGOV_USERNAME }}
cf_password: ${{ secrets.CLOUDGOV_PASSWORD }}
cf_org: gsa-tts-benefits-studio
cf_space: notify-production
push_arguments: >-
cf_command: >-
push -f manifest.yml
--vars-file deploy-config/production.yml
--var DANGEROUS_SALT="$DANGEROUS_SALT"
--var SECRET_KEY="$SECRET_KEY"
--var ADMIN_CLIENT_USERNAME="notify-admin"
--var ADMIN_CLIENT_SECRET="$ADMIN_CLIENT_SECRET"
--var ADMIN_CLIENT_USERNAME="$ADMIN_CLIENT_USERNAME"
--var NEW_RELIC_LICENSE_KEY="$NEW_RELIC_LICENSE_KEY"
--var NR_BROWSER_KEY="$NR_BROWSER_KEY"
--var COMMIT_HASH="$COMMIT_HASH"
--var LOGIN_PEM="$LOGIN_PEM"
--var LOGIN_DOT_GOV_CLIENT_ID="$LOGIN_DOT_GOV_CLIENT_ID"
--var LOGIN_DOT_GOV_USER_INFO_URL="$LOGIN_DOT_GOV_USER_INFO_URL"
--var LOGIN_DOT_GOV_ACCESS_TOKEN_URL="$LOGIN_DOT_GOV_ACCESS_TOKEN_URL"
@@ -85,6 +87,9 @@ jobs:
--var LOGIN_DOT_GOV_BASE_LOGOUT_URL="$LOGIN_DOT_GOV_BASE_LOGOUT_URL"
--var LOGIN_DOT_GOV_SIGNOUT_REDIRECT="$LOGIN_DOT_GOV_SIGNOUT_REDIRECT"
--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"
--strategy rolling
- name: Check for changes to egress config
id: changed-egress-config
@@ -97,6 +102,10 @@ jobs:
- name: Deploy egress proxy
if: steps.changed-egress-config.outputs.any_changed == 'true'
uses: ./.github/actions/deploy-proxy
env:
CF_USERNAME: ${{ secrets.CLOUDGOV_USERNAME }}
CF_PASSWORD: ${{ secrets.CLOUDGOV_PASSWORD }}
with:
cf_org: gsa-tts-benefits-studio
cf_space: notify-production
app: notify-admin-production

View File

@@ -53,11 +53,12 @@ jobs:
- name: Deploy to cloud.gov
uses: 18f/cg-deploy-action@main
uses: cloud-gov/cg-cli-tools@main
env:
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
SECRET_KEY: ${{ secrets.SECRET_KEY }}
ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
ADMIN_CLIENT_USERNAME: "notify-admin"
NEW_RELIC_LICENSE_KEY: ${{ secrets.NEW_RELIC_LICENSE_KEY }}
NR_BROWSER_KEY: ${{ secrets.NR_BROWSER_KEY }}
COMMIT_HASH: ${{ github.sha }}
@@ -68,22 +69,23 @@ jobs:
LOGIN_DOT_GOV_LOGOUT_URL: "https://secure.login.gov/openid_connect/logout?client_id=urn:gov:gsa:openidconnect.profiles:sp:sso:gsa:notify-gov&post_logout_redirect_uri=https://notify-staging.app.cloud.gov/sign-out"
LOGIN_DOT_GOV_BASE_LOGOUT_URL: "https://secure.login.gov/openid_connect/logout?"
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=STATEE"
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"
with:
cf_username: ${{ secrets.CLOUDGOV_USERNAME }}
cf_password: ${{ secrets.CLOUDGOV_PASSWORD }}
cf_org: gsa-tts-benefits-studio
cf_space: notify-staging
push_arguments: >-
cf_command: >-
push -f manifest.yml
--vars-file deploy-config/staging.yml
--var DANGEROUS_SALT="$DANGEROUS_SALT"
--var SECRET_KEY="$SECRET_KEY"
--var ADMIN_CLIENT_USERNAME="notify-admin"
--var ADMIN_CLIENT_SECRET="$ADMIN_CLIENT_SECRET"
--var ADMIN_CLIENT_USERNAME="$ADMIN_CLIENT_USERNAME"
--var NEW_RELIC_LICENSE_KEY="$NEW_RELIC_LICENSE_KEY"
--var NR_BROWSER_KEY="$NR_BROWSER_KEY"
--var COMMIT_HASH="$COMMIT_HASH"
--var LOGIN_PEM="$LOGIN_PEM"
--var LOGIN_DOT_GOV_CLIENT_ID="$LOGIN_DOT_GOV_CLIENT_ID"
--var LOGIN_DOT_GOV_USER_INFO_URL="$LOGIN_DOT_GOV_USER_INFO_URL"
--var LOGIN_DOT_GOV_ACCESS_TOKEN_URL="$LOGIN_DOT_GOV_ACCESS_TOKEN_URL"
@@ -91,6 +93,9 @@ jobs:
--var LOGIN_DOT_GOV_BASE_LOGOUT_URL="$LOGIN_DOT_GOV_BASE_LOGOUT_URL"
--var LOGIN_DOT_GOV_SIGNOUT_REDIRECT="$LOGIN_DOT_GOV_SIGNOUT_REDIRECT"
--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"
--strategy rolling
- name: Check for changes to egress config
@@ -104,7 +109,11 @@ jobs:
- name: Deploy egress proxy
if: steps.changed-egress-config.outputs.any_changed == 'true'
uses: ./.github/actions/deploy-proxy
env:
CF_USERNAME: ${{ secrets.CLOUDGOV_USERNAME }}
CF_PASSWORD: ${{ secrets.CLOUDGOV_PASSWORD }}
with:
cf_org: gsa-tts-benefits-studio
cf_space: notify-staging
app: notify-admin-staging

6
.gitignore vendored
View File

@@ -14,6 +14,7 @@
*.XLSX
## Non user files allowed to be commited
!app/assets/pdf/tcpa_overview.pdf
!tests/test_pdf_files/no_eof_marker.pdf
!tests/test_pdf_files/multi_page_pdf.pdf
!tests/test_pdf_files/big.pdf
@@ -134,3 +135,8 @@ playwright/
# Nodenv
.node-version
# BackstopJS
backstop_data/bitmaps_test/
backstop_data/html_report/
backstop_data/engine_scripts/playwright/

3
.prettierrc Normal file
View File

@@ -0,0 +1,3 @@
{
"singleQuote": true
}

View File

@@ -15,7 +15,6 @@ NVMSH := $(shell [ -f "$(HOME)/.nvm/nvm.sh" ] && echo "$(HOME)/.nvm/nvm.sh" || e
.PHONY: bootstrap
bootstrap: generate-version-file ## Set up everything to run the app
poetry self update
poetry self add poetry-dotenv-plugin
poetry lock --no-update
poetry install --sync --no-root

View File

@@ -372,15 +372,9 @@ After you have completed all setup steps, you will be unable to log in, because
will not be a user in the database to link to the login.gov account you are using. So
you will need to create that user in your database using the 'create-test-user' command.
Open two terminals pointing to the api project and then run these commands in the
respective terminals.
Open a terminal pointing to the api project and then run this command.
(Server 1)
env ALLOW_EXPIRED_API_TOKEN=1 make run-flask
(Server 2)
poetry run flask command create-admin-jwt | tail -n 1 | pbcopy
poetry run flask command create-test-user --admin=True;
```poetry run flask command create-test-user --admin=True```
Supply your name, email address, mobile number, and password when prompted. Make sure the email address
is the same one you are using in login.gov and make sure your phone number is in the format 5555555555.
@@ -507,3 +501,13 @@ insurance.
For more information on what we're working on, the Notify tool, and how to get
involved with our team,
[see our flyer.](https://github.com/GSA/notifications-admin/blob/main/docs/notify-pilot-flyer.md)
## Updating secrets for the E2E tests
At some point, E2E tests will fail because the secrets held in VCAP_SERVICES have expired. To refresh
them, you will need to do the following:
1. Log in the normal way to access cloudfoundry command line options
2. In your terminal, run `chmod +x print_vcap.sh`
3. In your terminal, run `./print_vcap.sh`
4. Copy the value in your terminal and paste it into the VCAP_SERVICES secret in Github on the staging tier.

View File

@@ -0,0 +1,2 @@
Contact: mailto:notify-support@gsa.gov
Expires: 2035-10-15T23:59:59Z

View File

@@ -1,8 +1,9 @@
import os
import pathlib
import secrets
from functools import partial
from time import monotonic
from urllib.parse import urlparse, urlunparse
from urllib.parse import unquote, urlparse, urlunparse
import jinja2
from flask import (
@@ -114,6 +115,7 @@ from notifications_utils.formatters import (
get_lines_with_normalised_whitespace,
)
from notifications_utils.recipients import format_phone_number_human_readable
from notifications_utils.url_safe_token import generate_token
login_manager = LoginManager()
csrf = CSRFProtect()
@@ -139,6 +141,10 @@ def _csp(config):
logo_domain = config["LOGO_CDN_DOMAIN"]
return {
"default-src": ["'self'", asset_domain],
"frame-src": [
"https://www.youtube.com",
"https://www.youtube-nocookie.com",
],
"frame-ancestors": "'none'",
"form-action": "'self'",
"script-src": [
@@ -162,6 +168,41 @@ def _csp(config):
def create_app(application):
@application.context_processor
def inject_feature_flags():
feature_about_page_enabled = application.config.get(
"FEATURE_ABOUT_PAGE_ENABLED", False
)
return dict(
FEATURE_ABOUT_PAGE_ENABLED=feature_about_page_enabled,
)
@application.context_processor
def inject_initial_signin_url():
ttl = 24 * 60 * 60
# make and store the state
state = generate_token(
str(request.remote_addr),
current_app.config["SECRET_KEY"],
current_app.config["DANGEROUS_SALT"],
)
state_key = f"login-state-{unquote(state)}"
redis_client.set(state_key, state, ex=ttl)
# make and store the nonce
nonce = secrets.token_urlsafe()
nonce_key = f"login-nonce-{unquote(nonce)}"
redis_client.set(nonce_key, nonce, ex=ttl)
url = os.getenv("LOGIN_DOT_GOV_INITIAL_SIGNIN_URL")
if url is not None:
url = url.replace("NONCE", nonce)
url = url.replace("STATE", state)
return {"initial_signin_url": url}
notify_environment = os.environ["NOTIFY_ENVIRONMENT"]
application.config.from_object(configs[notify_environment])

View File

@@ -68,11 +68,8 @@
<p class="usa-body">
Try again later.
</p>
<p class="usa-body">
You can check our <a class="usa-link"
href="https://status.notifications.service.gov.uk/">system status</a> page to see if there are any known
issues.<br />To report a problem, email <a
href="mailto:gov-uk-notify-support@digital.cabinet-office.gov.uk">gov-uk-notify-support@digital.cabinet-office.gov.uk</a>
<p>To report a problem you can email us at <a class="usa-link" href="mailto:notify-support@gsa.gov">notify-support@gsa.gov</a>.</p>
<p>You can expect a response within one business day.</p>
</div>
</div>
</main>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

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><g><path d="m377.64 347.666c-4.473 0-8.1 3.626-8.1 8.099s3.626 8.1 8.1 8.1c4.473 0 8.099-3.626 8.099-8.1s-3.626-8.099-8.099-8.099z"/><path d="m377.716 334.615c4.149 0 7.511-3.363 7.511-7.511v-67.172c0-4.148-3.362-7.511-7.511-7.511-4.148 0-7.511 3.363-7.511 7.511v67.172c0 4.148 3.362 7.511 7.511 7.511z"/><path d="m377.64 219.085c-7.974 0-15.716 1.011-23.105 2.912v-14.937c0-59.921-37.644-111.208-90.522-131.476 2.741-6.491 4.267-13.614 4.267-21.092 0-30.047-24.445-54.492-54.492-54.492s-54.491 24.445-54.491 54.491c0 7.469 1.522 14.586 4.256 21.071-16.063 6.135-30.994 15.219-44.006 26.957-3.081 2.778-3.325 7.528-.547 10.608 2.781 3.081 7.53 3.324 10.608.546 23.118-20.854 53.014-32.339 84.18-32.339 69.324 0 125.725 56.4 125.725 125.725v20.222c-32.217 14.573-54.688 47.021-54.688 84.618 0 11.997 2.288 23.47 6.45 34.005h-203.212v-138.845c0-24.475 7.036-48.196 20.346-68.599 2.267-3.474 1.288-8.128-2.187-10.394-3.474-2.266-8.129-1.288-10.394 2.186-14.907 22.851-22.787 49.41-22.787 76.807v143.829l-28.543 37.616c-1.903 2.506-2.952 5.62-2.952 8.768v27.183c0 7.996 6.505 14.501 14.501 14.501h94.92c-.468 3.102-.719 6.274-.719 9.504 0 35.036 28.504 63.541 63.541 63.541 35.036 0 63.541-28.504 63.541-63.541 0-3.232-.263-6.402-.735-9.504h29.487c4.149 0 7.511-3.363 7.511-7.511s-3.362-7.511-7.511-7.511h-249.514v-26.486l27.713-36.521h214.585c15.307 24.506 41.72 41.39 72.142 43.548v19.459h-29.946c-4.148 0-7.511 3.363-7.511 7.511s3.362 7.511 7.511 7.511h30.467c7.996 0 14.5-6.505 14.5-14.501v-20.125c47.261-4.255 84.425-44.082 84.425-92.431 0-51.178-41.636-92.814-92.814-92.814zm-127.992-148.137c-11.454-3.02-23.471-4.636-35.86-4.636-12.217 0-24.259 1.583-35.863 4.634-2.311-5.012-3.607-10.584-3.607-16.455 0-21.764 17.706-39.469 39.469-39.469s39.469 17.706 39.469 39.469c.002 5.873-1.295 11.445-3.608 16.457zm-83.427 368.007h95.144c.616 3.074.942 6.251.942 9.504 0 26.753-21.765 48.519-48.519 48.519s-48.519-21.766-48.519-48.519c.001-3.254.335-6.429.952-9.504zm211.419-49.263c-42.895 0-77.793-34.898-77.793-77.793s34.897-77.793 77.793-77.793 77.793 34.898 77.793 77.793c-.001 42.895-34.898 77.793-77.793 77.793z"/></g></g></g></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -0,0 +1,17 @@
<svg width="48" height="49" viewBox="0 0 48 49" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_6378_116)">
<path d="M13.3517 3.77441H4.3344C3.40346 3.80666 3.40421 5.14865 4.3344 5.18053H13.3516C14.2826 5.14828 14.2819 3.80629 13.3517 3.77441Z" fill="black"/>
<path d="M15.8219 10.6309H5.94759C4.67037 10.6309 3.63135 11.6699 3.63135 12.9471V13.9669C3.63135 15.2441 4.67037 16.2832 5.94759 16.2832H15.8219C17.0991 16.2832 18.1381 15.2441 18.1381 13.9669V12.9471C18.1381 11.67 17.0991 10.6309 15.8219 10.6309ZM16.732 13.9669C16.732 14.4688 16.3238 14.877 15.8219 14.877H5.94759C5.4457 14.877 5.03746 14.4688 5.03746 13.9669V12.9471C5.03746 12.4452 5.4457 12.037 5.94759 12.037H15.8219C16.3238 12.037 16.732 12.4452 16.732 12.9471V13.9669Z" fill="black"/>
<path d="M10.2759 20.161V23.0556C10.2759 24.3328 11.3149 25.3718 12.5921 25.3718H22.4664C23.7436 25.3718 24.7826 24.3328 24.7826 23.0556V20.161C24.7826 18.8838 23.7436 17.8447 22.4664 17.8447H12.5921C11.3149 17.8446 10.2759 18.8838 10.2759 20.161ZM23.3765 20.161V23.0556C23.3765 23.5575 22.9683 23.9657 22.4664 23.9657H12.5921C12.0902 23.9657 11.682 23.5575 11.682 23.0556V20.161C11.682 19.6591 12.0902 19.2508 12.5921 19.2508H22.4664C22.9683 19.2507 23.3765 19.6591 23.3765 20.161Z" fill="black"/>
<path d="M3.63135 32.1435C3.63135 33.4207 4.67037 34.4597 5.94759 34.4597H15.8219C17.0991 34.4597 18.1381 33.4207 18.1381 32.1435V29.2489C18.1381 27.9716 17.0991 26.9326 15.8219 26.9326H5.94759C4.67037 26.9326 3.63135 27.9716 3.63135 29.2489V32.1435ZM5.03746 29.2489C5.03746 28.747 5.4457 28.3387 5.94759 28.3387H15.8219C16.3238 28.3387 16.732 28.747 16.732 29.2489V32.1435C16.732 32.6454 16.3238 33.0536 15.8219 33.0536H5.94759C5.4457 33.0536 5.03746 32.6454 5.03746 32.1435V29.2489Z" fill="black"/>
<path d="M38.1102 19.9331C33.5406 19.9331 29.6852 23.0494 28.5583 27.2682V3.4397C28.5583 1.81976 27.2404 0.501953 25.6205 0.501953H2.93784C1.3179 0.501953 0 1.81986 0 3.4397V20.0432C0 20.4314 0.314688 20.7462 0.703056 20.7462C1.09142 20.7462 1.40611 20.4314 1.40611 20.0432V8.45258H27.1521V28.8182C23.2126 29.346 20.0003 32.203 18.9507 35.9537H5.77819C4.52478 35.9537 3.50497 36.9735 3.50497 38.227C3.50497 39.4805 4.52478 40.5002 5.77819 40.5002H18.7678C18.9094 41.2299 19.1315 41.9311 19.4245 42.5943H2.93784C2.09323 42.5943 1.40611 41.9072 1.40611 41.0626V23.6671C1.40611 23.2788 1.09142 22.964 0.703056 22.964C0.314688 22.964 0 23.2788 0 23.6671V41.0626C0 42.6825 1.3179 44.0004 2.93784 44.0004H20.1877C22.6379 47.9355 28.1585 49.6822 32.5122 47.6362L34.4133 48.4393C34.9706 48.5729 35.2962 48.357 35.39 47.7917V45.6731C37.0359 44.0629 38.0518 41.9709 38.2985 39.6981C39.9145 39.6673 41.5059 39.2395 42.9126 38.4563C43.7068 38.0141 43.0228 36.7855 42.2286 37.2278C39.8606 38.5633 36.8283 38.6501 34.3934 37.4377C34.2107 37.3484 33.9984 37.3426 33.8112 37.4218L32.5984 37.9342V36.5738C32.5984 36.3771 32.516 36.1895 32.3712 36.0564C26.7203 30.87 30.4316 21.3351 38.1102 21.3392C45.1057 21.3061 49.1324 29.5318 44.8031 35.021C44.2444 35.738 45.3535 36.6024 45.9122 35.8853C50.961 29.4838 46.2654 19.8946 38.1102 19.9331ZM1.40611 7.04647V3.4397C1.40611 2.59509 2.09323 1.90807 2.93784 1.90807H25.6205C26.4651 1.90807 27.1522 2.59519 27.1522 3.4397V7.04647H1.40611ZM5.77819 39.0941C4.62902 39.0477 4.6277 37.4068 5.77819 37.3598H18.6662C18.5935 37.9316 18.5709 38.5182 18.5987 39.0941H5.77819ZM31.1924 36.8756V38.9945C31.2862 39.5598 31.6118 39.7757 32.169 39.6421L34.0701 38.839C34.9717 39.2439 35.9161 39.5072 36.8914 39.6264C36.6543 41.6316 35.7171 43.4683 34.211 44.8537C34.0663 44.9869 33.9839 45.1745 33.9839 45.3712V46.7316L32.7711 46.2192C32.5838 46.1401 32.3715 46.1458 32.1888 46.2351C26.6793 49.009 19.9179 44.7879 19.9931 38.6138C19.993 34.0203 23.6664 30.2683 28.2304 30.14C28.3143 32.6748 29.3798 35.0983 31.1924 36.8756Z" fill="black"/>
<path d="M40.2727 27.1796C41.2036 27.1473 41.2028 25.8053 40.2727 25.7734H35.9479C35.017 25.8057 35.0177 27.1477 35.9479 27.1796H40.2727Z" fill="black"/>
<path d="M42.9383 29.1133H33.2819C32.351 29.1455 32.3517 30.4875 33.2819 30.5194H42.9383C43.8692 30.4871 43.8685 29.1452 42.9383 29.1133Z" fill="black"/>
<path d="M35.9479 32.4531C35.017 32.4854 35.0177 33.8274 35.9479 33.8592H40.2727C41.2036 33.827 41.2028 32.485 40.2727 32.4531H35.9479Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_6378_116">
<rect width="48" height="48" fill="white" transform="translate(0 0.5)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,22 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_6311_9508)">
<path d="M126.125 15.0417C127.161 15.0417 128 14.2022 128 13.1667V6.11825C128 2.74475 125.255 0 121.882 0H79.0155C75.6418 0 72.897 2.74475 72.897 6.11825V32.04C72.897 32.1707 72.8253 32.2905 72.71 32.3522L66.7345 35.552C65.5993 36.16 64.8943 37.3375 64.8943 38.625C64.8943 39.9125 65.5993 41.09 66.7345 41.698L72.71 44.8975C72.8255 44.9595 72.8973 45.079 72.8973 45.21V60.1317C72.8973 63.5055 75.642 66.25 79.0158 66.25H121.882C125.255 66.25 128 63.5052 128 60.1317V21.8333C128 20.7978 127.161 19.9583 126.125 19.9583C125.09 19.9583 124.25 20.7978 124.25 21.8333V60.1315C124.25 61.4375 123.188 62.4997 121.882 62.4997H79.0155C77.7095 62.4997 76.647 61.4373 76.647 60.1315V45.21C76.647 43.694 75.8168 42.3075 74.4803 41.5918L68.9398 38.625L74.4805 35.658C75.817 34.9422 76.6473 33.556 76.6473 32.04V6.11825C76.6473 4.81225 77.7098 3.75 79.0158 3.75H121.882C123.188 3.75 124.25 4.8125 124.25 6.11825V13.1665C124.25 14.2023 125.09 15.0417 126.125 15.0417Z" fill="black"/>
<path d="M45 49.6535V46.1367C47.5645 45.614 49.5 43.3415 49.5 40.625C49.5 37.5233 46.9767 35 43.875 35H34.875C31.7733 35 29.25 37.5233 29.25 40.625C29.25 43.3415 31.1855 45.6142 33.75 46.1367V49.6535C14.6938 52.3915 0 68.8232 0 88.625C0 100.683 5.4325 111.92 14.9047 119.453C15.7153 120.098 16.8947 119.964 17.5392 119.153C18.184 118.342 18.0495 117.163 17.239 116.519C8.6665 109.701 3.75 99.5338 3.75 88.625C3.75 68.9813 19.7313 53 39.375 53C59.0187 53 75 68.9813 75 88.625C75 108.269 59.0187 124.25 39.375 124.25C34.1278 124.25 29.0715 123.131 24.3463 120.923C23.408 120.485 22.2922 120.89 21.8538 121.828C21.4153 122.766 21.8205 123.882 22.7588 124.32C27.9848 126.762 33.5752 128 39.375 128C61.0865 128 78.75 110.337 78.75 88.625C78.75 68.8232 64.0563 52.3915 45 49.6535ZM33 40.625C33 39.591 33.841 38.75 34.875 38.75H43.875C44.909 38.75 45.75 39.591 45.75 40.625C45.75 41.659 44.909 42.5 43.875 42.5H34.875C33.841 42.5 33 41.659 33 40.625ZM37.5 49.2957V46.25H41.25V49.2957C40.6285 49.2665 40.0037 49.25 39.375 49.25C38.7463 49.25 38.1215 49.2665 37.5 49.2957Z" fill="black"/>
<path d="M71.25 88.625C71.25 71.049 56.951 56.75 39.375 56.75C21.799 56.75 7.5 71.049 7.5 88.625C7.5 106.201 21.799 120.5 39.375 120.5C56.951 120.5 71.25 106.201 71.25 88.625ZM11.25 88.625C11.25 73.1167 23.8667 60.5 39.375 60.5C54.8833 60.5 67.5 73.1167 67.5 88.625C67.5 104.133 54.8833 116.75 39.375 116.75C23.8667 116.75 11.25 104.133 11.25 88.625Z" fill="black"/>
<path d="M114.771 35.4187C116.496 33.7365 117.106 31.268 116.361 28.9762C115.616 26.6845 113.672 25.0457 111.288 24.6992L108.759 24.3317C108.149 24.243 107.622 23.86 107.349 23.3072L106.219 21.0152C105.152 18.8542 102.993 17.5117 100.583 17.5117C98.1738 17.5117 96.0145 18.8542 94.9483 21.015L93.8175 23.3067C93.5448 23.8597 93.0175 24.243 92.4073 24.3317L89.879 24.6992C87.4945 25.0457 85.5508 26.6845 84.806 28.9762C84.0613 31.268 84.6705 33.7365 86.3958 35.4187L88.226 37.2032C88.6678 37.634 88.869 38.254 88.7648 38.862L88.3325 41.3825C87.9253 43.7575 88.8835 46.1122 90.8328 47.5285C91.9343 48.3287 93.2228 48.7352 94.52 48.7352C95.519 48.7352 96.523 48.4942 97.4508 48.0062L99.7123 46.817C100.258 46.5302 100.909 46.53 101.455 46.817L103.715 48.0055C105.848 49.1267 108.384 48.944 110.334 47.5277C112.284 46.1115 113.242 43.7562 112.834 41.381L112.402 38.862C112.298 38.254 112.5 37.634 112.941 37.2035L114.771 35.4187ZM112.153 32.7337L110.323 34.5182C108.998 35.8105 108.393 37.6715 108.706 39.4957L109.138 42.0147C109.305 42.9872 108.928 43.914 108.13 44.4937C107.332 45.0737 106.334 45.1457 105.46 44.6865L103.2 43.498C101.562 42.6365 99.6053 42.6367 97.9668 43.498L95.7053 44.6872C94.8323 45.1462 93.8348 45.0742 93.0368 44.4945C92.2388 43.9147 91.862 42.9885 92.0285 42.0162L92.4608 39.496C92.7738 37.6715 92.1693 35.8107 90.8438 34.5182L89.0135 32.7337C88.307 32.045 88.0673 31.0737 88.3723 30.1352C88.6773 29.197 89.442 28.5522 90.4183 28.4102L92.9465 28.0427C94.7785 27.7765 96.3613 26.6262 97.1803 24.9662L98.311 22.6745C98.7475 21.79 99.5968 21.262 100.583 21.262C101.57 21.262 102.419 21.79 102.855 22.6745L103.986 24.9665C104.805 26.6265 106.388 27.7765 108.22 28.0427L110.748 28.4102C111.725 28.5522 112.489 29.197 112.794 30.1352C113.099 31.0735 112.86 32.045 112.153 32.7337Z" fill="black"/>
<path d="M39.375 69.328C40.4105 69.328 41.25 68.4885 41.25 67.453V66.625C41.25 65.5895 40.4105 64.75 39.375 64.75C38.3395 64.75 37.5 65.5895 37.5 66.625V67.453C37.5 68.4885 38.3395 69.328 39.375 69.328Z" fill="black"/>
<path d="M41.25 110.625V109.797C41.25 108.761 40.4105 107.922 39.375 107.922C38.3395 107.922 37.5 108.761 37.5 109.797V110.625C37.5 111.66 38.3395 112.5 39.375 112.5C40.4105 112.5 41.25 111.66 41.25 110.625Z" fill="black"/>
<path d="M55.6717 74.9795L56.2572 74.394C56.9895 73.6618 56.9895 72.4745 56.2572 71.7425C55.525 71.0103 54.3377 71.0103 53.6057 71.7425L53.0202 72.328C52.288 73.0603 52.2625 74.2738 53.0202 74.9795C53.802 75.708 55.0207 75.6248 55.6717 74.9795Z" fill="black"/>
<path d="M23.0783 102.27L22.4928 102.855C21.7605 103.588 21.7605 104.775 22.4928 105.507C23.203 106.217 24.4155 106.236 25.1443 105.507L25.7298 104.921C26.462 104.189 26.462 103.002 25.7298 102.27C24.9978 101.538 23.8105 101.538 23.0783 102.27Z" fill="black"/>
<path d="M60.5471 90.5H61.3751C62.4106 90.5 63.2501 89.6605 63.2501 88.625C63.2501 87.5895 62.4106 86.75 61.3751 86.75H60.5471C59.5116 86.75 58.6721 87.5895 58.6721 88.625C58.6721 89.6605 59.5116 90.5 60.5471 90.5Z" fill="black"/>
<path d="M18.203 86.75H17.375C16.3395 86.75 15.5 87.5895 15.5 88.625C15.5 89.6605 16.3395 90.5 17.375 90.5H18.203C19.2385 90.5 20.078 89.6605 20.078 88.625C20.078 87.5895 19.2385 86.75 18.203 86.75Z" fill="black"/>
<path d="M53.6054 105.507C54.3159 106.217 55.5276 106.236 56.2569 105.507C56.9891 104.775 56.9891 103.587 56.2569 102.855L55.6714 102.27C54.9391 101.538 53.7519 101.538 53.0199 102.27C52.2876 103.002 52.2876 104.189 53.0199 104.921L53.6054 105.507Z" fill="black"/>
<path d="M25.1445 71.7425C24.4123 71.0103 23.225 71.0103 22.493 71.7425C21.7608 72.4748 21.7608 73.662 22.493 74.394C22.493 74.394 23.0778 74.9788 23.0785 74.9795C23.784 75.685 25.0075 75.702 25.73 74.9795C26.4623 74.2473 26.4623 73.06 25.73 72.328L25.1445 71.7425Z" fill="black"/>
<path d="M42.5417 93.2714L49.2532 98.3992C49.593 98.6587 49.9932 98.7844 50.3902 98.7844C50.9545 98.7844 51.5125 98.5307 51.8815 98.0477C52.5102 97.2247 52.3527 96.0482 51.53 95.4194L44.7607 90.2474C44.9157 89.7337 45.0002 89.1892 45.0002 88.6254C45.0002 86.1809 43.4325 84.0969 41.2502 83.3229V74.9092C41.2502 73.8737 40.4107 73.0342 39.3752 73.0342C38.3397 73.0342 37.5002 73.8737 37.5002 74.9092V83.3229C35.318 84.0969 33.7502 86.1809 33.7502 88.6254C33.7502 91.7272 36.2735 94.2504 39.3752 94.2504C40.5487 94.2504 41.6392 93.8887 42.5417 93.2714ZM37.5 88.6254C37.5 87.5914 38.341 86.7504 39.375 86.7504C40.409 86.7504 41.25 87.5914 41.25 88.6254C41.25 89.6594 40.409 90.5004 39.375 90.5004C38.341 90.5004 37.5 89.6594 37.5 88.6254Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_6311_9508">
<rect width="128" height="128" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 7.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@@ -0,0 +1,10 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M117.375 5.82422H27.1625C26.127 5.82422 25.2875 6.66347 25.2875 7.69922C25.2875 8.73497 26.127 9.57422 27.1625 9.57422H117.375C121.166 9.57422 124.25 12.6582 124.25 16.4492V29.1212H3.75V16.4492C3.75 12.6585 6.834 9.57422 10.625 9.57422H18.4125C19.448 9.57422 20.2875 8.73497 20.2875 7.69922C20.2875 6.66347 19.448 5.82422 18.4125 5.82422H10.625C4.76625 5.82422 0 10.5905 0 16.4492V107.668C0 113.527 4.76625 118.293 10.625 118.293H48.4953C53.1185 120.77 58.3983 122.176 64 122.176C69.6018 122.176 74.8815 120.77 79.5048 118.293H117.375C123.234 118.293 128 113.527 128 107.668V16.4492C128 10.5905 123.234 5.82422 117.375 5.82422ZM37.2557 77.5242H47.687C47.0868 80.5977 46.7183 83.9017 46.6203 87.3632H34.8717C35.0877 83.9435 35.8947 80.6245 37.2557 77.5242ZM73.674 116.778C76.1003 113.758 78.0847 109.612 79.4355 104.702H88.7452C85.26 110.259 79.956 114.565 73.674 116.778ZM73.3053 68.1122C74.1665 69.8347 74.909 71.7352 75.5245 73.774H65.875V60.3527C68.5888 61.2235 71.2215 63.945 73.3053 68.1122ZM76.4805 77.5242C77.1335 80.613 77.5238 83.9302 77.628 87.3632H65.875V77.5242H76.4805ZM77.6277 91.1132C77.5235 94.5462 77.1332 97.8635 76.4802 100.952H65.875V91.1132H77.6277ZM75.5242 104.702C74.9087 106.741 74.1663 108.642 73.305 110.364C71.2215 114.531 68.5887 117.253 65.8747 118.124V104.702H75.5242ZM62.125 100.952H51.5195C50.8665 97.8637 50.4763 94.5465 50.372 91.1135H62.125V100.952ZM62.125 104.702V118.124C59.4113 117.253 56.7785 114.531 54.6948 110.364C53.8335 108.642 53.0913 106.741 52.4757 104.702H62.125ZM90.733 100.952H80.313C80.9133 97.879 81.2818 94.575 81.3798 91.1135H93.128C92.9062 94.5922 92.0723 97.9077 90.733 100.952ZM81.3798 87.3632C81.2818 83.9015 80.9135 80.5977 80.313 77.5242H90.733C92.0725 80.569 92.9062 83.8842 93.128 87.3632H81.3798ZM79.4355 73.7742C78.0847 68.8642 76.1003 64.7182 73.674 61.6985C79.956 63.9117 85.26 68.2172 88.7452 73.7742H79.4355ZM62.125 60.353V73.7742H52.4757C53.0913 71.7355 53.8338 69.8347 54.6948 68.1125C56.7785 63.945 59.4113 61.2235 62.125 60.353ZM62.125 77.5242V87.3632H50.3722C50.4765 83.9302 50.8667 80.613 51.5197 77.5242H62.125ZM46.6203 91.1132C46.7183 94.575 47.0865 97.8787 47.687 100.952H37.267C35.9277 97.9075 35.0938 94.5922 34.872 91.1132H46.6203ZM48.5645 104.702C49.9152 109.612 51.8997 113.758 54.326 116.778C48.044 114.565 42.74 110.259 39.2547 104.702H48.5645ZM124.25 107.668C124.25 111.459 121.166 114.543 117.375 114.543H85.0622C92.3148 108.496 96.9375 99.397 96.9375 89.2382C96.9375 71.1897 82.282 56.3007 64 56.3007C56.5457 56.3007 49.2417 58.8607 43.4333 63.5095C42.6248 64.1565 42.494 65.3365 43.141 66.145C43.7878 66.9532 44.968 67.0847 45.7765 66.4372C48.3908 64.345 51.276 62.7467 54.347 61.6722C51.9113 64.694 49.9193 68.8497 48.5645 73.774H39.2405C39.506 73.35 39.783 72.932 40.0715 72.5197C40.6652 71.6712 40.4592 70.5022 39.6107 69.9085C38.7625 69.3142 37.5933 69.5202 36.9995 70.369C33.1152 75.917 31.0623 82.442 31.0623 89.2382C31.0623 99.397 35.6852 108.496 42.9375 114.543H10.625C6.834 114.543 3.75 111.459 3.75 107.668V48.4022H78.2968C79.3325 48.4022 80.1718 47.563 80.1718 46.5272C80.1718 45.4915 79.3325 44.6522 78.2968 44.6522H3.75V32.871H124.25V36.8865H104.122C102.787 36.8865 101.531 37.4065 100.587 38.3507L94.6523 44.2855C94.4157 44.5217 94.1017 44.652 93.768 44.652H87.2968C86.261 44.652 85.4218 45.4912 85.4218 46.527C85.4218 47.5627 86.261 48.402 87.2968 48.402H93.768C95.1032 48.402 96.3585 47.882 97.3037 46.9377L103.239 41.0027C103.475 40.7667 103.788 40.6365 104.122 40.6365H124.25V107.668Z" fill="black"/>
<path d="M120.234 19.3476C120.234 16.1728 117.651 13.5898 114.477 13.5898C111.302 13.5898 108.719 16.1728 108.719 19.3476C108.719 22.5223 111.302 25.1053 114.477 25.1053C117.651 25.1053 120.234 22.5223 120.234 19.3476ZM112.469 19.3476C112.469 18.2403 113.369 17.3398 114.476 17.3398C115.583 17.3398 116.484 18.2406 116.484 19.3476C116.484 20.4546 115.583 21.3553 114.476 21.3553C113.369 21.3553 112.469 20.4546 112.469 19.3476Z" fill="black"/>
<path d="M104.703 19.3476C104.703 16.1728 102.12 13.5898 98.9453 13.5898C95.7705 13.5898 93.1875 16.1726 93.1875 19.3476C93.1875 22.5226 95.7705 25.1053 98.9453 25.1053C102.12 25.1053 104.703 22.5223 104.703 19.3476ZM96.9375 19.3476C96.9375 18.2403 97.8383 17.3398 98.9453 17.3398C100.052 17.3398 100.953 18.2406 100.953 19.3476C100.953 20.4546 100.052 21.3553 98.9453 21.3553C97.8383 21.3553 96.9375 20.4546 96.9375 19.3476Z" fill="black"/>
<path d="M89.172 19.3476C89.172 16.1728 86.589 13.5898 83.4142 13.5898C80.2395 13.5898 77.6565 16.1728 77.6565 19.3476C77.6565 22.5223 80.2395 25.1053 83.4142 25.1053C86.589 25.1053 89.172 22.5223 89.172 19.3476ZM81.4062 19.3476C81.4062 18.2403 82.307 17.3398 83.414 17.3398C84.521 17.3398 85.4217 18.2406 85.4217 19.3476C85.4217 20.4546 84.521 21.3553 83.414 21.3553C82.307 21.3553 81.4062 20.4546 81.4062 19.3476Z" fill="black"/>
<path d="M7.76538 17.3398V21.3553C7.76538 23.4231 9.44763 25.1053 11.5154 25.1053H38.8279C40.8956 25.1053 42.5779 23.4231 42.5779 21.3553V17.3398C42.5779 15.2721 40.8956 13.5898 38.8279 13.5898H11.5154C9.44788 13.5898 7.76538 15.2721 7.76538 17.3398ZM38.8304 21.3556H11.5154V17.3398H38.8279L38.8304 21.3556Z" fill="black"/>
<path d="M93.0546 38.7617C93.0546 37.726 92.2154 36.8867 91.1796 36.8867H25.1716C24.1361 36.8867 23.2966 37.726 23.2966 38.7617C23.2966 39.7975 24.1361 40.6367 25.1716 40.6367H91.1794C92.2151 40.6367 93.0546 39.7972 93.0546 38.7617Z" fill="black"/>
<path d="M17.4062 40.6367C18.4418 40.6367 19.2812 39.7973 19.2812 38.7617C19.2812 37.7262 18.4418 36.8867 17.4062 36.8867C16.3707 36.8867 15.5312 37.7262 15.5312 38.7617C15.5312 39.7973 16.3707 40.6367 17.4062 40.6367Z" fill="black"/>
<path d="M9.64038 40.6367C10.6759 40.6367 11.5154 39.7973 11.5154 38.7617C11.5154 37.7262 10.6759 36.8867 9.64038 36.8867C8.60485 36.8867 7.76538 37.7262 7.76538 38.7617C7.76538 39.7973 8.60485 40.6367 9.64038 40.6367Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -0,0 +1,3 @@
<svg viewBox="0 0 563 670" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M553.831 334.751V335.974L555.03 335.731C555.104 335.716 555.181 335.708 555.262 335.708H557.846C558.483 335.708 559 336.224 559 336.862V418.708C559 419.345 558.483 419.862 557.846 419.862H555.262C555.181 419.862 555.104 419.853 555.03 419.838L553.831 419.595V420.818V955.446C553.831 970.12 547.528 991.015 535.312 1008.3C522.978 1025.76 503.794 1040.6 477.723 1040.6H82.2769C56.206 1040.6 37.022 1025.76 24.6885 1008.3C12.472 991.015 6.16923 970.12 6.16923 955.446V420.818V419.595L4.97026 419.838C4.89621 419.853 4.8188 419.862 4.73846 419.862H2.15385C1.51659 419.862 1 419.345 1 418.708V358.4C1 357.763 1.51659 357.246 2.15385 357.246H4.73846C4.8188 357.246 4.89621 357.254 4.97026 357.269L6.16923 357.513V356.289V347.588V346.364L4.97026 346.608C4.89621 346.623 4.8188 346.631 4.73846 346.631H2.15385C1.51659 346.631 1 346.114 1 345.477V285.169C1 284.532 1.51659 284.015 2.15385 284.015H4.73846C4.8188 284.015 4.89621 284.023 4.97026 284.038L6.16923 284.282V283.058V261.434V260.21L4.97026 260.454C4.89621 260.469 4.8188 260.477 4.73846 260.477H2.15385C1.51659 260.477 1 259.96 1 259.323V220.554C1 219.917 1.51659 219.4 2.15385 219.4H4.73846C4.8188 219.4 4.89624 219.408 4.97036 219.423L6.16923 219.666V218.443V86.1538C6.16923 71.4804 12.472 50.5848 24.6885 33.2974C37.022 15.8443 56.206 1 82.2769 1H477.723C503.794 1 522.978 15.8443 535.312 33.2974C547.528 50.5848 553.831 71.4804 553.831 86.1538V334.751ZM400.615 16.2308H399.615V17.2308V43.0769C399.615 49.6619 394.277 55 387.692 55H172.308C165.723 55 160.385 49.6619 160.385 43.0769V17.2308V16.2308H159.385H82.2769C62.6883 16.2308 47.6257 27.2304 37.1269 42.0872C26.5125 57.1076 21.4 74.9813 21.4 86.1538V955.446C21.4 966.619 26.5125 984.492 37.1269 999.513C47.6257 1014.37 62.6883 1025.37 82.2769 1025.37H477.723C497.312 1025.37 512.374 1014.37 522.873 999.513C533.487 984.492 538.6 966.619 538.6 955.446V86.1538C538.6 74.9813 533.488 57.1076 522.873 42.0872C512.374 27.2304 497.312 16.2308 477.723 16.2308H400.615Z" stroke="black" stroke-width="2"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@@ -0,0 +1,17 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_6311_9575)">
<path d="M13.1356 105.339H93.2878C94.3236 105.339 95.1628 104.5 95.1628 103.464C95.1628 102.428 94.3236 101.589 93.2878 101.589H13.1356C11.6753 101.589 10.4873 100.401 10.4873 98.9407V26.0474H44.2016C41.9081 29.6852 40.5788 33.9892 40.5788 38.5982V46.6989C37.1923 47.1732 34.5773 50.0874 34.5773 53.6027V86.9362C34.5773 90.7812 37.7053 93.9092 41.5503 93.9092H86.8113C90.6563 93.9092 93.7843 90.7812 93.7843 86.9362V53.6029C93.7843 50.0877 91.1693 47.1734 87.7826 46.6992V38.5984C87.7826 33.9892 86.4533 29.6854 84.1598 26.0477H119.138V98.9409C119.138 100.401 117.95 101.589 116.49 101.589H102.282C101.246 101.589 100.407 102.428 100.407 103.464C100.407 104.5 101.246 105.339 102.282 105.339H116.49C120.018 105.339 122.888 102.469 122.888 98.9409V14.1582C122.888 9.20744 118.86 5.17969 113.909 5.17969H38.9261C37.8903 5.17969 37.0511 6.01894 37.0511 7.05469C37.0511 8.09044 37.8903 8.92969 38.9261 8.92969H113.909C116.792 8.92969 119.138 11.2752 119.138 14.1582V22.2974H81.3611C81.3201 22.2974 81.2798 22.3009 81.2393 22.3034C76.9391 17.8034 70.8815 14.9962 64.1805 14.9962C57.4533 14.9962 51.3748 17.8257 47.0716 22.3564C46.9241 22.3192 10.4873 22.2972 10.4873 22.2972V14.1582C10.4873 11.2752 12.8328 8.92969 15.7158 8.92969H30.1583C31.1941 8.92969 32.0333 8.09044 32.0333 7.05469C32.0333 6.01894 31.1941 5.17969 30.1583 5.17969H15.7158C10.7651 5.17969 6.7373 9.20744 6.7373 14.1582V98.9409C6.7373 102.469 9.60755 105.339 13.1356 105.339ZM90.0343 53.6029V86.9364C90.0343 88.7134 88.5886 90.1594 86.8113 90.1594H41.5503C39.7733 90.1594 38.3273 88.7137 38.3273 86.9364V53.6029C38.3273 51.8259 39.7731 50.3799 41.5503 50.3799H86.8113C88.5886 50.3802 90.0343 51.8259 90.0343 53.6029ZM74.5733 46.6302H53.7881V38.5984C53.7881 32.8677 58.4501 28.2057 64.1805 28.2057C69.911 28.2057 74.5731 32.8677 74.5731 38.5984V46.6302H74.5733ZM64.1808 18.7464C75.1271 18.7464 84.0326 27.6519 84.0326 38.5982V46.6299H78.3233V38.5982C78.3233 30.7999 71.979 24.4554 64.1808 24.4554C56.3826 24.4554 50.0383 30.7999 50.0383 38.5982V46.6299H44.3291V38.5982C44.3288 27.6519 53.2346 18.7464 64.1808 18.7464Z" fill="black"/>
<path d="M91.6201 17.4883C92.6558 17.4883 93.4951 16.649 93.4951 15.6133C93.4951 14.5775 92.6558 13.7383 91.6201 13.7383H89.5701C88.5343 13.7383 87.6951 14.5775 87.6951 15.6133C87.6951 16.649 88.5343 17.4883 89.5701 17.4883H91.6201Z" fill="black"/>
<path d="M100.641 17.4883C101.676 17.4883 102.516 16.649 102.516 15.6133C102.516 14.5775 101.676 13.7383 100.641 13.7383H98.5906C97.5548 13.7383 96.7156 14.5775 96.7156 15.6133C96.7156 16.649 97.5548 17.4883 98.5906 17.4883H100.641Z" fill="black"/>
<path d="M109.661 17.4883C110.697 17.4883 111.536 16.649 111.536 15.6133C111.536 14.5775 110.697 13.7383 109.661 13.7383H107.611C106.575 13.7383 105.736 14.5775 105.736 15.6133C105.736 16.649 106.575 17.4883 107.611 17.4883H109.661Z" fill="black"/>
<path d="M126.125 113.899H105.969C105.146 110.921 102.414 108.728 99.1775 108.728C95.9412 108.728 93.2095 110.921 92.3863 113.899H35.6138C34.7905 110.921 32.0588 108.728 28.8228 108.728C25.5865 108.728 22.8547 110.921 22.0315 113.899H1.875C0.83925 113.899 0 114.738 0 115.774C0 116.81 0.83925 117.649 1.875 117.649H22.0315C22.8547 120.627 25.5865 122.82 28.8228 122.82C32.0588 122.82 34.7905 120.627 35.6138 117.649H92.3865C93.2097 120.627 95.9415 122.82 99.1777 122.82C102.414 122.82 105.146 120.627 105.969 117.649H126.125C127.161 117.649 128 116.81 128 115.774C128 114.738 127.161 113.899 126.125 113.899ZM28.8228 119.07C27.005 119.07 25.5263 117.591 25.5263 115.774C25.5263 113.956 27.005 112.477 28.8228 112.477C30.6402 112.477 32.119 113.956 32.119 115.774C32.119 117.591 30.6402 119.07 28.8228 119.07ZM99.1775 119.07C97.3597 119.07 95.881 117.591 95.881 115.774C95.881 113.956 97.3597 112.477 99.1775 112.477C100.995 112.477 102.474 113.956 102.474 115.774C102.474 117.591 100.995 119.07 99.1775 119.07Z" fill="black"/>
<path d="M74.6482 63.1457C73.9162 62.4137 72.7289 62.4135 71.9967 63.146C71.2644 63.8782 71.2644 65.0655 71.9969 65.7975L76.4694 70.2697L71.9967 74.7422C71.2644 75.4747 71.2644 76.6617 71.9967 77.394C72.3629 77.76 72.8429 77.943 73.3227 77.943C73.8024 77.943 74.2824 77.76 74.6487 77.394L80.4469 71.5957C80.7984 71.244 80.9959 70.7672 80.9959 70.2697C80.9959 69.7722 80.7984 69.2957 80.4467 68.9437L74.6482 63.1457Z" fill="black"/>
<path d="M51.8922 70.2697L56.3647 65.7974C57.0972 65.0652 57.0972 63.8779 56.365 63.1459C55.6327 62.4139 54.4455 62.4134 53.7135 63.1456L47.9152 68.9436C47.5635 69.2954 47.366 69.7722 47.366 70.2697C47.366 70.7672 47.5635 71.2436 47.915 71.5956L53.7132 77.3939C54.0795 77.7599 54.5595 77.9429 55.0392 77.9429C55.519 77.9429 55.999 77.7599 56.3652 77.3939C57.0975 76.6614 57.0975 75.4744 56.3652 74.7421L51.8922 70.2697Z" fill="black"/>
<path d="M66.0639 62.6508C65.0587 62.4026 64.0422 63.0161 63.7937 64.0211L60.9274 75.6176C60.6792 76.6228 61.2927 77.6393 62.2977 77.8878C62.4487 77.9251 62.6002 77.9431 62.7492 77.9431C63.5912 77.9431 64.3569 77.3716 64.5679 76.5176L67.4342 64.9211C67.6824 63.9158 67.0689 62.8996 66.0639 62.6508Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_6311_9575">
<rect width="128" height="128" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@@ -0,0 +1,12 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_6311_9539)">
<path d="M107.26 81.0871C108.302 81.0871 109.145 80.2431 109.145 79.2021V61.7874C109.145 60.7464 108.302 59.9023 107.26 59.9023H103.538C102.497 59.9023 101.653 60.7464 101.653 61.7874C101.653 62.8285 102.497 63.6725 103.538 63.6725H105.375V79.2021C105.375 80.2431 106.219 81.0871 107.26 81.0871Z" fill="black"/>
<path d="M105.03 95.3332C104.018 95.0871 102.999 95.7069 102.752 96.7186L97.7374 117.306C97.6188 117.793 97.2262 117.927 97.0625 117.963C96.8997 117.998 96.486 118.037 96.1776 117.642L59.5854 70.7809L122.95 13.8064L115.318 45.1362C115.072 46.1479 115.692 47.1676 116.703 47.4139C116.853 47.4503 117.003 47.4679 117.151 47.4679C118 47.4679 118.771 46.8901 118.981 46.0285L127.914 9.35889C128.13 8.46888 127.846 7.53061 127.173 6.91004C126.499 6.28972 125.541 6.08387 124.671 6.37267L34.2959 36.438C33.3079 36.7667 32.7735 37.8339 33.1023 38.8217C33.4308 39.8095 34.4985 40.3441 35.4858 40.0153L119.097 12.2011L56.5961 68.3984L5.56399 49.9696L27.7773 42.58C28.7653 42.2513 29.2997 41.1841 28.9709 40.1963C28.6424 39.2088 27.5755 38.6744 26.5874 39.0027L1.98209 47.1877C0.793983 47.5828 0.0163241 48.647 0.000238096 49.8989C-0.0153452 51.1506 0.735168 52.2342 1.91221 52.6592L37.0421 65.3453V98.9988C37.0421 100.55 37.8471 101.934 39.1953 102.701C39.8571 103.077 40.5798 103.265 41.3014 103.265C42.0504 103.265 42.7986 103.062 43.4772 102.659L51.7857 97.7167C52.6807 97.1843 52.9743 96.0276 52.4422 95.1328C51.9098 94.2378 50.7532 93.9442 49.8584 94.4763L41.5499 99.4185C41.3479 99.5386 41.1717 99.4871 41.0591 99.4233C40.9465 99.3592 40.8122 99.2335 40.8122 98.9988V66.7068L55.8657 72.1429L65.8687 84.9529L56.7635 90.3691C55.8685 90.9015 55.5749 92.0581 56.107 92.9529C56.4597 93.5456 57.0863 93.8746 57.729 93.8746C58.057 93.8746 58.3887 93.7891 58.6908 93.6094L68.2077 87.9484L93.2062 119.962C94.1045 121.113 95.4456 121.755 96.8595 121.755C97.1892 121.755 97.523 121.72 97.856 121.648C99.6162 121.27 100.974 119.948 101.401 118.198L106.416 97.6108C106.662 96.5994 106.042 95.5797 105.03 95.3332Z" fill="black"/>
<path d="M126.484 72.7292C125.468 72.51 124.464 73.1573 124.244 74.1747C122.533 82.1121 115.391 87.873 107.26 87.873C97.6782 87.873 89.8825 80.0773 89.8825 70.495C89.8825 60.9128 97.6782 53.1171 107.26 53.1171C115.446 53.1171 122.599 58.9234 124.269 66.9232C124.482 67.9424 125.482 68.5969 126.5 68.3832C127.519 68.1703 128.173 67.1718 127.96 66.1526C125.927 56.4145 117.221 49.3467 107.261 49.3467C95.5995 49.3467 86.1125 58.8337 86.1125 70.4948C86.1125 82.1559 95.5995 91.6429 107.261 91.6429C112.123 91.6429 116.871 89.9511 120.63 86.8791C124.335 83.8517 126.927 79.6216 127.93 74.9685C128.149 73.9515 127.502 72.9484 126.484 72.7292Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_6311_9539">
<rect width="128" height="128" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

View File

@@ -0,0 +1 @@
<svg id="Capa_1" enable-background="new 0 0 512 512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><g><path d="m488.19 30.63h-48.55c-4.143 0-7.5 3.357-7.5 7.5s3.357 7.5 7.5 7.5h48.551c4.857 0 8.81 3.952 8.81 8.811v39.835h-482.001v-39.836c0-4.858 3.952-8.811 8.81-8.811h380.83c4.143 0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-380.83c-13.129.001-23.81 10.683-23.81 23.811v403.12c0 13.129 10.681 23.811 23.81 23.811h69c4.143 0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-69c-4.857 0-8.81-3.952-8.81-8.811v-348.285h482v348.285c0 4.858-3.952 8.811-8.81 8.811h-360.38c-4.143 0-7.5 3.357-7.5 7.5s3.357 7.5 7.5 7.5h360.38c13.129 0 23.81-10.682 23.81-23.811v-403.12c0-13.128-10.681-23.81-23.81-23.81z"/><path d="m185.41 134.28h-131.91c-7.444 0-13.5 6.056-13.5 13.5v66.13c0 7.444 6.056 13.5 13.5 13.5h405c7.444 0 13.5-6.056 13.5-13.5v-66.13c0-7.444-6.056-13.5-13.5-13.5h-238.09c-4.143 0-7.5 3.357-7.5 7.5s3.357 7.5 7.5 7.5h236.59v63.13h-321.142v-63.13h49.552c4.143 0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5zm-64.552 78.13h-65.858v-63.13h65.858z"/><path d="m67.935 188.478 11.756 9.094c1.321 1.021 2.937 1.567 4.589 1.567.329 0 .66-.021.989-.065 1.986-.265 3.783-1.312 4.992-2.909l18.666-24.671c2.499-3.304 1.847-8.007-1.456-10.507-3.304-2.499-8.006-1.847-10.507 1.456l-14.092 18.626-5.76-4.456c-3.275-2.533-7.985-1.934-10.521 1.344-2.534 3.275-1.933 7.985 1.344 10.521z"/><path d="m153.684 180.845c0 4.143 3.357 7.5 7.5 7.5h72.66c4.143 0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-72.66c-4.143 0-7.5 3.357-7.5 7.5z"/><path d="m431.671 188.345c4.143 0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-162.823c-4.143 0-7.5 3.357-7.5 7.5s3.357 7.5 7.5 7.5z"/><path d="m53.504 441.366h404.992c7.444 0 13.5-6.056 13.5-13.5v-66.132c0-7.444-6.056-13.5-13.5-13.5h-404.992c-7.444 0-13.5 6.056-13.5 13.5v66.132c0 7.445 6.056 13.5 13.5 13.5zm403.492-15h-321.138v-63.132h321.138zm-401.992-63.132h65.854v63.132h-65.854z"/><path d="m98.342 394.8 6.604-6.604c2.929-2.93 2.929-7.678 0-10.607-2.93-2.928-7.678-2.928-10.607 0l-6.604 6.604-6.604-6.604c-2.93-2.928-7.678-2.928-10.607 0-2.929 2.93-2.929 7.678 0 10.607l6.604 6.604-6.604 6.604c-2.929 2.93-2.929 7.678 0 10.607 1.465 1.464 3.385 2.196 5.304 2.196s3.839-.732 5.304-2.196l6.604-6.604 6.604 6.604c1.465 1.464 3.385 2.196 5.304 2.196s3.839-.732 5.304-2.196c2.929-2.93 2.929-7.678 0-10.607z"/><path d="m161.184 402.3h72.66c4.143 0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-72.66c-4.143 0-7.5 3.357-7.5 7.5s3.357 7.5 7.5 7.5z"/><path d="m268.848 402.3h162.823c4.143 0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-162.823c-4.143 0-7.5 3.357-7.5 7.5s3.357 7.5 7.5 7.5z"/><path d="m458.496 241.257h-404.992c-7.444 0-13.5 6.056-13.5 13.5v66.132c0 7.444 6.056 13.5 13.5 13.5h404.992c7.444 0 13.5-6.056 13.5-13.5v-66.132c0-7.445-6.056-13.5-13.5-13.5zm-403.492 15h65.854v63.132h-65.854zm401.992 63.132h-321.138v-63.132h321.138z"/><path d="m107.471 269.506c-3.304-2.499-8.006-1.847-10.507 1.456l-14.092 18.626-5.76-4.456c-3.275-2.534-7.985-1.933-10.521 1.344-2.534 3.276-1.933 7.986 1.344 10.521l11.756 9.094c1.321 1.021 2.937 1.567 4.589 1.567.329 0 .66-.021.989-.065 1.986-.265 3.783-1.312 4.992-2.909l18.666-24.671c2.499-3.304 1.846-8.007-1.456-10.507z"/><path d="m359.011 295.322h72.66c4.143 0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-72.66c-4.143 0-7.5 3.357-7.5 7.5s3.357 7.5 7.5 7.5z"/><path d="m161.184 295.322h162.823c4.143 0 7.5-3.357 7.5-7.5s-3.357-7.5-7.5-7.5h-162.823c-4.143 0-7.5 3.357-7.5 7.5s3.357 7.5 7.5 7.5z"/><g><circle cx="42.069" cy="69.954" r="7.5"/><circle cx="76.192" cy="69.954" r="7.5"/><circle cx="110.31" cy="69.954" r="7.5"/></g></g><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -0,0 +1,12 @@
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_6311_9544)">
<path d="M31.5182 96.3591C31.7232 97.3748 32.7129 98.0311 33.7269 97.8261C38.9609 96.7696 42.8322 94.7671 45.6829 92.5183C48.5337 94.7671 52.4049 96.7698 57.6389 97.8261C58.6529 98.0311 59.6429 97.3746 59.8477 96.3591C60.0524 95.3441 59.3957 94.3551 58.3807 94.1503C54.1179 93.2898 50.8949 91.7473 48.4574 89.9433C51.1487 87.0021 52.9734 83.4338 53.8114 79.8881H58.3314C59.3672 79.8881 60.2064 79.0486 60.2064 78.0131C60.2064 76.9776 59.3672 76.1381 58.3314 76.1381H47.5584V71.7363C47.5584 70.7008 46.7192 69.8613 45.6834 69.8613C44.6477 69.8613 43.8084 70.7008 43.8084 71.7363V76.1381H33.0344C31.9987 76.1381 31.1594 76.9776 31.1594 78.0131C31.1594 79.0486 31.9987 79.8881 33.0344 79.8881H37.5544C38.3907 83.4258 40.2092 86.9866 42.8907 89.9241C40.4537 91.7403 37.2347 93.2923 32.9852 94.1501C31.9699 94.3548 31.3132 95.3441 31.5182 96.3591ZM41.4162 79.8881H49.9329C49.3807 81.7618 48.1822 84.6693 45.6567 87.4271C43.1337 84.6718 41.9552 81.7671 41.4162 79.8881Z" fill="black"/>
<path d="M82.3162 18.748C81.5372 18.748 80.839 19.23 80.5627 19.9585L71.3715 44.2103C71.0045 45.1785 71.492 46.261 72.4602 46.628C73.429 46.995 74.5112 46.5073 74.8782 45.5393L76.6965 40.7418C76.7585 40.748 76.8212 40.7513 76.885 40.7513H87.84C87.873 40.7513 87.905 40.748 87.9375 40.7463L89.754 45.539C90.1212 46.5075 91.2042 46.9945 92.172 46.6278C93.1402 46.2608 93.6277 45.1783 93.2607 44.21L84.0695 19.9583C83.7935 19.23 83.0955 18.748 82.3162 18.748ZM78.1142 37.0013L82.3162 25.9138L86.5182 37.0013H78.1142Z" fill="black"/>
<path d="M11.7858 116.457H16.6226C18.1479 116.457 19.5237 117.42 20.0462 118.853L22.5182 125.628C23.0439 127.069 24.3747 128 25.9087 128C27.4427 128 28.7737 127.069 29.2997 125.628L31.7715 118.852C32.2943 117.42 33.67 116.457 35.195 116.457H53.6349C54.6707 116.457 55.5099 115.618 55.5099 114.582C55.5099 113.547 54.6707 112.707 53.6349 112.707H35.1953C32.1008 112.707 29.3092 114.66 28.2487 117.567L25.9092 123.98L23.5694 117.567C22.5089 114.66 19.7174 112.707 16.6229 112.707H11.7858C7.35481 112.707 3.75003 109.103 3.75003 104.672V62.0325C3.75003 57.6015 7.35481 53.9967 11.7858 53.9967H36.633V54.4249C36.633 60.9237 41.9201 66.2108 48.4189 66.2108H87.6172V104.672C87.6172 109.103 84.0122 112.708 79.5811 112.708H62.3852C61.3495 112.708 60.5102 113.547 60.5102 114.583C60.5102 115.618 61.3495 116.458 62.3852 116.458H79.5811C86.0799 116.458 91.3672 111.171 91.3672 104.672V66.2108H92.805C94.33 66.2108 95.706 67.1735 96.2285 68.606L98.7003 75.3813C99.2263 76.8226 100.558 77.7536 102.091 77.7536C103.626 77.7536 104.956 76.8221 105.482 75.3813L107.954 68.606C108.477 67.1735 109.852 66.2108 111.377 66.2108H116.214C122.713 66.2108 128 60.9237 128 54.4249V38.8768C128 37.8413 127.161 37.0018 126.125 37.0018C125.089 37.0018 124.25 37.8413 124.25 38.8768V54.4249C124.25 58.856 120.645 62.4607 116.214 62.4607H111.377C108.283 62.4607 105.491 64.4138 104.431 67.3205L102.091 73.7338L99.7515 67.3205C98.6908 64.4138 95.899 62.4607 92.805 62.4607C91.289 62.4607 50.0484 62.4607 48.4189 62.4607C43.9878 62.4607 40.3831 58.856 40.3831 54.4249C40.3831 52.6232 40.3831 14.9124 40.3831 11.7856C40.3831 7.35481 43.9878 3.75003 48.4186 3.75003H116.214C120.645 3.75003 124.25 7.35481 124.25 11.7858V30.1267C124.25 31.1622 125.089 32.0018 126.125 32.0018C127.161 32.0018 128 31.1622 128 30.1267V11.7858C128 5.28704 122.713 0 116.214 0H48.4186C41.9201 0 36.6328 5.28704 36.6328 11.7858V50.2466H11.7858C5.28729 50.2466 0 55.5337 0 62.0325V104.672C0 111.17 5.28729 116.457 11.7858 116.457Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_6311_9544">
<rect width="128" height="128" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

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="m291.532 66.273c4.142 0 7.5-3.357 7.5-7.5v-.057c0-4.143-3.358-7.472-7.5-7.472s-7.5 3.386-7.5 7.528 3.358 7.501 7.5 7.501z"/><path d="m254.455 66.273c4.142 0 7.5-3.357 7.5-7.5v-.057c0-4.143-3.358-7.472-7.5-7.472s-7.5 3.386-7.5 7.528 3.358 7.501 7.5 7.501z"/><path d="m217.378 66.273c4.142 0 7.5-3.357 7.5-7.5v-.057c0-4.143-3.358-7.472-7.5-7.472s-7.5 3.386-7.5 7.528 3.358 7.501 7.5 7.501z"/><path d="m123.925 51.273-76.763-.057c-.002 0-.003 0-.005 0-4.14 0-7.497 3.354-7.5 7.494-.003 4.143 3.353 7.503 7.495 7.506l76.763.057h.005c4.14 0 7.497-3.354 7.5-7.494.002-4.142-3.353-7.503-7.495-7.506z"/><path d="m287.507 124.863h-111.062c-6.933 0-12.574 5.641-12.574 12.574v33.479c0 6.948 5.641 12.602 12.574 12.602h111.062c6.933 0 12.574-5.653 12.574-12.602v-33.479c0-6.933-5.641-12.574-12.574-12.574zm-2.426 43.655h-106.209v-28.654h106.209z"/><path d="m292.581 210.217h-121.209c-4.142 0-7.5 3.357-7.5 7.5s3.358 7.5 7.5 7.5h121.209c4.142 0 7.5-3.357 7.5-7.5s-3.358-7.5-7.5-7.5z"/><path d="m189.882 245.736h-18.51c-4.142 0-7.5 3.357-7.5 7.5s3.358 7.5 7.5 7.5h18.51c4.142 0 7.5-3.357 7.5-7.5s-3.358-7.5-7.5-7.5z"/><path d="m292.581 245.736h-62.05c-4.142 0-7.5 3.357-7.5 7.5s3.358 7.5 7.5 7.5h62.05c4.142 0 7.5-3.357 7.5-7.5s-3.358-7.5-7.5-7.5z"/><path d="m444.802 450.744h-.255c-4.142 0-7.5 3.357-7.5 7.5s3.358 7.5 7.5 7.5h.255c4.142 0 7.5-3.357 7.5-7.5s-3.358-7.5-7.5-7.5z"/><path d="m490.667 301.75h-59.114v-129.049c0-11.669-9.494-21.163-21.163-21.163h-71.7v-114.592c0-11.404-9.278-20.682-20.682-20.682h-297.327c-11.404.001-20.681 9.278-20.681 20.682v241.718c0 11.419 9.277 20.709 20.681 20.709h33.801v97.131c0 11.669 9.494 21.163 21.163 21.163h104.223l-8.866 29.646h-14.994c-13.342 0-24.196 10.867-24.196 24.226v11.707c0 6.887 5.603 12.489 12.489 12.489h197.434c6.887 0 12.489-5.603 12.489-12.489v-11.707c0-13.358-10.867-24.226-24.225-24.226h-14.991l-8.847-29.646h71.443v56.735c0 11.763 9.557 21.333 21.305 21.333h91.758c11.763 0 21.333-9.57 21.333-21.333v-151.346c0-11.748-9.57-21.306-21.333-21.306zm-475.667-23.086v-177.438h137.039c4.142 0 7.5-3.357 7.5-7.5s-3.358-7.5-7.5-7.5h-137.039v-49.28c0-3.133 2.548-5.682 5.681-5.682h297.327c3.133 0 5.682 2.549 5.682 5.682v49.279h-137.011c-4.142 0-7.5 3.357-7.5 7.5s3.358 7.5 7.5 7.5h137.011v177.438c0 3.147-2.549 5.709-5.682 5.709h-297.327c-3.133.001-5.681-2.56-5.681-5.708zm303.008 20.709c11.404 0 20.682-9.29 20.682-20.709v-112.126h71.7c3.398 0 6.163 2.765 6.163 6.163v129.049h-17.644c-11.748 0-21.305 9.558-21.305 21.306v41.683h-308.122v-65.365h248.526zm21.215 172.166v9.196h-192.411v-9.196c0-5.087 4.125-9.226 9.196-9.226h173.991c5.086 0 9.224 4.139 9.224 9.226zm-79.014-68.872c-4.142 0-7.5 3.357-7.5 7.5s3.358 7.5 7.5 7.5h30.298l8.847 29.646h-112.696l8.866-29.646h30.188c4.142 0 7.5-3.357 7.5-7.5s-3.358-7.5-7.5-7.5h-150.067c-3.398 0-6.163-2.765-6.163-6.163v-16.766h308.123v22.929zm236.791 71.735c0 3.492-2.841 6.333-6.333 6.333h-91.758c-3.477 0-6.305-2.841-6.305-6.333v-151.346c0-3.477 2.828-6.306 6.305-6.306h91.758c3.492 0 6.333 2.829 6.333 6.306z"/><path d="m127.661 124.863h-76.451c-6.949 0-12.603 5.641-12.603 12.574v110.696c0 6.949 5.653 12.603 12.603 12.603h76.451c6.949 0 12.602-5.653 12.602-12.603v-110.695c0-6.934-5.653-12.575-12.602-12.575zm-2.398 120.873h-71.655v-105.873h71.655z"/></g></g></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -1,7 +1,8 @@
(function (window) {
if (document.getElementById('activityChartContainer')) {
const tableContainer = document.getElementById('activityContainer');
const currentUserName = tableContainer.getAttribute('data-currentUserName');
const COLORS = {
delivered: '#0076d6',
failed: '#fa9441',
@@ -33,30 +34,43 @@
.attr('id', 'tooltip')
.style('display', 'none');
}
// Create legend
// Calculate total messages
const totalMessages = d3.sum(deliveredData) + d3.sum(failedData);
// Create legend only if there are messages
const legendContainer = d3.select('.chart-legend');
legendContainer.selectAll('*').remove(); // Clear any existing legend
const legendData = [
{ label: 'Delivered', color: COLORS.delivered },
{ label: 'Failed', color: COLORS.failed }
];
if (totalMessages > 0) {
// Show legend if there are messages
const legendData = [
{ label: 'Delivered', color: COLORS.delivered },
{ label: 'Failed', color: COLORS.failed }
];
const legendItem = legendContainer.selectAll('.legend-item')
.data(legendData)
.enter()
.append('div')
.attr('class', 'legend-item');
const legendItem = legendContainer.selectAll('.legend-item')
.data(legendData)
.enter()
.append('div')
.attr('class', 'legend-item');
legendItem.append('div')
.attr('class', 'legend-rect')
.style('background-color', d => d.color)
.style('display', 'inline-block')
.style('margin-right', '5px');
legendItem.append('div')
.attr('class', 'legend-rect')
.style('background-color', d => d.color)
.style('display', 'inline-block')
.style('margin-right', '5px');
legendItem.append('span')
.attr('class', 'legend-label')
.text(d => d.label);
legendItem.append('span')
.attr('class', 'legend-label')
.text(d => d.label);
// Ensure the legend is shown
legendContainer.style('display', 'flex');
} else {
// Hide the legend if there are no messages
legendContainer.style('display', 'none');
}
const x = d3.scaleBand()
.domain(labels)
@@ -257,27 +271,58 @@
subTitle.textContent = `${selectedText} - last 7 days`;
fetchData(selectedValue);
// Update ARIA live region
const liveRegion = document.getElementById('aria-live-account');
liveRegion.textContent = `Data updated for ${selectedText} - last 7 days`;
// Switch tables based on dropdown selection
const selectedTable = selectedValue === "individual" ? "table1" : "table2";
const tables = document.querySelectorAll('.table-overflow-x-auto');
tables.forEach(function(table) {
table.classList.add('hidden'); // Hide all tables by adding the hidden class
table.classList.remove('visible'); // Ensure they are not visible
});
const tableToShow = document.getElementById(selectedTable);
tableToShow.classList.remove('hidden'); // Remove hidden class
tableToShow.classList.add('visible'); // Add visible class
const tableHeading = document.querySelector('#tableActivity h2');
const senderColumns = document.querySelectorAll('.sender-column');
const allRows = document.querySelectorAll('#activity-table tbody tr');
const caption = document.querySelector('#activity-table caption');
if (selectedValue === 'individual') {
tableHeading.textContent = 'My activity';
caption.textContent = `Table showing the sent jobs for ${currentUserName}`;
senderColumns.forEach(col => {
col.style.display = 'none';
});
allRows.forEach(row => row.style.display = 'none');
const userRows = Array.from(allRows).filter(row => {
const senderCell = row.querySelector('.sender-column');
const rowSender = senderCell ? senderCell.textContent.trim() : '';
return rowSender === currentUserName;
});
userRows.slice(0, 5).forEach(row => {
row.style.display = '';
});
} else {
tableHeading.textContent = 'Service activity';
caption.textContent = `Table showing the sent jobs for service`;
senderColumns.forEach(col => {
col.style.display = '';
});
allRows.forEach((row, index) => {
row.style.display = (index < 5) ? '' : 'none';
});
}
};
document.addEventListener('DOMContentLoaded', function() {
// Initialize activityChart chart and table with service data by default
fetchData('service');
// Add event listener to the dropdown
const allRows = Array.from(document.querySelectorAll('#activity-table tbody tr'));
allRows.forEach((row, index) => {
row.style.display = (index < 5) ? '' : 'none';
});
const dropdown = document.getElementById('options');
dropdown.addEventListener('change', handleDropdownChange);
});

View File

@@ -0,0 +1,57 @@
document.addEventListener('DOMContentLoaded', () => {
const sidenavItems = document.querySelectorAll('.usa-sidenav__item > .parent-link');
let lastPath = window.location.pathname;
let debounceTimeout = null;
sidenavItems.forEach((link) => {
const parentItem = link.parentElement;
const sublist = parentItem.querySelector('.usa-sidenav__sublist');
const targetHref = link.getAttribute('href');
// initialize the menu to open the correct submenu based on the current route
if (window.location.pathname.startsWith(targetHref)) {
parentItem.classList.add('open');
link.setAttribute('aria-expanded', 'true');
}
link.addEventListener('click', (event) => {
const currentPath = window.location.pathname;
// prevent default behavior only if navigating to the same route
if (currentPath === targetHref) {
event.preventDefault();
return;
}
if (sublist && !parentItem.classList.contains('open')) {
// debounce the menu update to avoid flickering
clearTimeout(debounceTimeout);
debounceTimeout = setTimeout(() => {
parentItem.classList.add('open');
link.setAttribute('aria-expanded', 'true');
}, 50);
}
});
});
// handle browser back/forward navigation
window.addEventListener('popstate', () => {
const currentPath = window.location.pathname;
// sync menu state
sidenavItems.forEach((link) => {
const parentItem = link.parentElement;
const targetHref = link.getAttribute('href');
if (currentPath.startsWith(targetHref)) {
parentItem.classList.add('open');
link.setAttribute('aria-expanded', 'true');
} else {
parentItem.classList.remove('open');
link.setAttribute('aria-expanded', 'false');
}
});
lastPath = currentPath;
});
});

Binary file not shown.

View File

@@ -8,7 +8,7 @@
width: 100%;
max-width: 464px;
box-sizing: border-box;
padding: units(1);
padding: units(2);
background: color('gray-cool-10');
border: 1px solid color('gray-cool-10');
border-radius: 5px;

File diff suppressed because it is too large Load Diff

View File

@@ -9,6 +9,10 @@ in the form $setting: value,
@use "uswds-core" with (
$theme-font-type-sans: "public-sans",
$theme-card-border-radius: 0,
$theme-card-gap: 4,
$theme-card-border-width: 2px,
$theme-card-border-color: "ink",
$theme-show-notifications: false,
$theme-banner-max-width: "desktop-lg",
$theme-grid-container-max-width: "desktop-lg",

View File

@@ -34,6 +34,11 @@ $path: '/static/images/';
// Dependencies from GOV.UK Frontend, packaged to be specific to this application
@import './govuk-frontend/all';
// Custom overrides
.govuk-link {
font-weight: bold;
}
// Specific to this application
@import 'local/typography';
@import 'grids';

View File

@@ -88,6 +88,8 @@ class Config(object):
],
}
FEATURE_ABOUT_PAGE_ENABLED = getenv("FEATURE_ABOUT_PAGE_ENABLED", "false") == "true"
def _s3_credentials_from_env(bucket_prefix):
return {

View File

@@ -5,7 +5,7 @@
Explore Notify, add team members, and practice [sending messages to teammates](/using-notify/trial-mode).
2. ## Personalize content
Learn how to [personalize messages](/using-notify/guidance) to increase response.
Learn how to [personalize messages](/using-notify/how-to) to increase response.
3. ## Check delivery status
[Analyze the delivery](/using-notify/delivery-status) of your messages and download reports
@@ -14,7 +14,7 @@ Learn how to [personalize messages](/using-notify/guidance) to increase response
Learn about message _parts_ and [how limits are calculated](/using-notify/pricing).
5. ## Start sending messages
To remove the restrictions of Trial Mode and begin sending messages to clients complete the [Live Campaign Form](https://airtable.com/appe4n7jYOALPLcyU/shrIPWnLTw9U1fclL).
To remove the restrictions of Trial Mode and begin sending messages to clients complete the <a class="usa-link usa-link--external" href="https://docs.google.com/forms/d/1fnaBtxuGf3q-OdGVyt2LqBKvp9_P21kmKJa0yIK8rWM/edit">Go-Live Form</a>.
Well respond within one business day.
### Questions?

View File

@@ -41,14 +41,8 @@ class ValidGovEmail:
if field.data == "":
return
from flask import url_for
message = "Enter a public sector email address."
message = """
Enter a public sector email address or
<a class="usa-link" href="{}">find out who can use Notify</a>
""".format(
url_for("main.features")
)
if not is_gov_user(field.data.lower()):
raise ValidationError(message)

View File

@@ -14,7 +14,7 @@ from app import (
service_api_client,
template_statistics_client,
)
from app.formatters import format_date_numeric, format_datetime_numeric, get_time_left
from app.formatters import format_date_numeric, format_datetime_numeric
from app.main import main
from app.main.views.user_profile import set_timezone
from app.statistics_utils import get_formatted_percentage
@@ -62,32 +62,14 @@ def service_dashboard(service_id):
job_response = job_api_client.get_jobs(service_id)["data"]
service_data_retention_days = 7
jobs = [
{
"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"],
"processing_finished": job.get("processing_finished"),
"processing_started": job.get("processing_started"),
"notification_count": job["notification_count"],
"created_by": job["created_by"],
"template_name": job["template_name"],
"original_file_name": job["original_file_name"],
}
for job in job_response
if job["job_status"] != "cancelled"
]
filtered_jobs = [job for job in job_response if job["job_status"] != "cancelled"]
sorted_jobs = sorted(filtered_jobs, key=lambda job: job["created_at"], reverse=True)
return render_template(
"views/dashboard/dashboard.html",
updates_url=url_for(".service_dashboard_updates", service_id=service_id),
partials=get_dashboard_partials(service_id),
jobs=jobs,
jobs=sorted_jobs,
service_data_retention_days=service_data_retention_days,
sms_sent=sms_sent,
sms_allowance_remaining=sms_allowance_remaining,

View File

@@ -1,36 +1,50 @@
import os
from flask import abort, current_app, redirect, render_template, request, url_for
from flask import (
abort,
current_app,
jsonify,
redirect,
render_template,
request,
url_for,
)
from flask_login import current_user
from app import status_api_client
from app.formatters import apply_html_class, convert_markdown_template
from app.main import main
from app.main.views.pricing import CURRENT_SMS_RATE
from app.main.views.sub_navigation_dictionaries import features_nav, using_notify_nav
from app.main.views.sub_navigation_dictionaries import (
about_notify_nav,
using_notify_nav,
)
from app.utils.user import user_is_logged_in
from notifications_utils.url_safe_token import generate_token
# Hook to check for feature flags
@main.before_request
def check_feature_flags():
if request.path.startswith("/about") and not current_app.config.get(
"FEATURE_ABOUT_PAGE_ENABLED", False
):
abort(404)
@main.route("/test/feature-flags")
def test_feature_flags():
return jsonify(
{"FEATURE_ABOUT_PAGE_ENABLED": current_app.config["FEATURE_ABOUT_PAGE_ENABLED"]}
)
@main.route("/")
def index():
if current_user and current_user.is_authenticated:
return redirect(url_for("main.choose_account"))
token = generate_token(
str(request.remote_addr),
current_app.config["SECRET_KEY"],
current_app.config["DANGEROUS_SALT"],
)
url = os.getenv("LOGIN_DOT_GOV_INITIAL_SIGNIN_URL")
# handle unit tests
if url is not None:
url = url.replace("NONCE", token)
url = url.replace("STATE", token)
return render_template(
"views/signedout.html",
sms_rate=CURRENT_SMS_RATE,
counts=status_api_client.get_count_of_live_services_and_organizations(),
initial_signin_url=url,
)
@@ -86,44 +100,6 @@ def callbacks():
return redirect(url_for("main.documentation"), 301)
# --- Features page set --- #
@main.route("/features")
@user_is_logged_in
def features():
return render_template("views/features.html", navigation_links=features_nav())
@main.route("/features/roadmap", endpoint="roadmap")
@user_is_logged_in
def roadmap():
return render_template("views/roadmap.html", navigation_links=features_nav())
@main.route("/features/sms")
@user_is_logged_in
def features_sms():
return render_template(
"views/features/text-messages.html", navigation_links=features_nav()
)
@main.route("/features/security", endpoint="security")
@user_is_logged_in
def security():
return render_template("views/security.html", navigation_links=features_nav())
@main.route("/features/using_notify")
@user_is_logged_in
def using_notify():
return (
render_template("views/using-notify.html", navigation_links=features_nav()),
410,
)
@main.route("/using-notify/delivery-status")
@user_is_logged_in
def message_status():
@@ -178,53 +154,168 @@ def trial_mode_new():
)
@main.route("/using-notify/guidance")
@main.route("/using-notify/best-practices")
@user_is_logged_in
def guidance_index():
def best_practices():
return render_template(
"views/guidance/index.html",
"views/guides/best-practices.html",
navigation_links=using_notify_nav(),
)
@main.route("/using-notify/guidance/create-and-send-messages")
@main.route("/using-notify/best-practices/clear-goals")
@user_is_logged_in
def clear_goals():
return render_template(
"views/guides/clear-goals.html",
navigation_links=using_notify_nav(),
)
@main.route("/using-notify/best-practices/rules-and-regulations")
@user_is_logged_in
def rules_and_regulations():
return render_template(
"views/guides/rules-and-regulations.html",
navigation_links=using_notify_nav(),
)
@main.route("/using-notify/best-practices/establish-trust")
@user_is_logged_in
def establish_trust():
return render_template(
"views/guides/establish-trust.html",
navigation_links=using_notify_nav(),
)
@main.route("/using-notify/best-practices/write-for-action")
@user_is_logged_in
def write_for_action():
return render_template(
"views/guides/write-for-action.html",
navigation_links=using_notify_nav(),
)
@main.route("/using-notify/best-practices/multiple-languages")
@user_is_logged_in
def multiple_languages():
return render_template(
"views/guides/multiple-languages.html",
navigation_links=using_notify_nav(),
)
@main.route("/using-notify/best-practices/benchmark-performance")
@user_is_logged_in
def benchmark_performance():
return render_template(
"views/guides/benchmark-performance.html",
navigation_links=using_notify_nav(),
)
@main.route("/using-notify/how-to")
@user_is_logged_in
def how_to():
return render_template(
"views/how-to/index.html",
navigation_links=using_notify_nav(),
)
@main.route("/contact")
def contact():
return render_template(
"views/contact.html",
navigation_links=about_notify_nav(),
)
@main.route("/about")
def about_notify():
return render_template(
"views/about/about.html",
navigation_links=about_notify_nav(),
)
@main.route("/about/security")
def about_security():
return render_template(
"views/about/security.html",
navigation_links=about_notify_nav(),
)
@main.route("/about/why-text-messaging")
def why_text_messaging():
return render_template(
"views/about/why-text-messaging.html",
navigation_links=about_notify_nav(),
)
@main.route("/join-notify")
def join_notify():
return render_template(
"views/join-notify.html",
navigation_links=about_notify_nav(),
)
@main.route("/using-notify/how-to/create-and-send-messages")
@user_is_logged_in
def create_and_send_messages():
return render_template(
"views/guidance/create-and-send-messages.html",
"views/how-to/create-and-send-messages.html",
navigation_links=using_notify_nav(),
)
@main.route("/using-notify/guidance/edit-and-format-messages")
@main.route("/using-notify/how-to/edit-and-format-messages")
@user_is_logged_in
def edit_and_format_messages():
return render_template(
"views/guidance/edit-and-format-messages.html",
"views/how-to/edit-and-format-messages.html",
navigation_links=using_notify_nav(),
)
@main.route("/using-notify/guidance/send-files-by-email")
@main.route("/using-notify/how-to/send-files-by-email")
@user_is_logged_in
def send_files_by_email():
return render_template(
"views/guidance/send-files-by-email.html",
"views/how-to/send-files-by-email.html",
navigation_links=using_notify_nav(),
)
@main.route("/studio")
def studio():
return render_template(
"views/studio.html",
)
@main.route("/acceptable-use-policy")
def acceptable_use_policy():
return render_template(
"views/acceptable-use-policy.html",
)
# --- Redirects --- #
@main.route("/roadmap", endpoint="old_roadmap")
@main.route("/information-security", endpoint="information_security")
@main.route("/using_notify", endpoint="old_using_notify")
@main.route("/information-risk-management", endpoint="information_risk_management")
@main.route("/integration_testing", endpoint="old_integration_testing")
def old_page_redirects():
redirects = {
"main.old_roadmap": "main.roadmap",
"main.information_security": "main.using_notify",
"main.old_using_notify": "main.using_notify",
"main.information_risk_management": "main.security",

View File

@@ -17,14 +17,12 @@ def accept_invite(token):
and current_user.email_address.lower() != invited_user.email_address.lower()
):
message = Markup(
"""
Youre signed in as {}.
f"""
Youre signed in as {current_user.email_address}.
This invite is for another email address.
<a href={} class="usa-link">Sign out</a>
<a href={url_for("main.sign_out")} class="usa-link">Sign out</a>
and click the link again to accept this invite.
""".format(
current_user.email_address, url_for("main.sign_out")
)
"""
)
flash(message=message)

View File

@@ -57,7 +57,6 @@ def view_job(service_id, job_id):
filter_args = parse_filter_args(request.args)
filter_args["status"] = set_status_filters(filter_args)
return render_template(
"views/jobs/job.html",
job=job,
@@ -402,7 +401,7 @@ def get_job_partials(job):
)
if request.referrer is not None:
session["arrived_from_preview_page"] = "check" in request.referrer
session["arrived_from_preview_page"] = ("check" in request.referrer) or ("help=0" in request.referrer)
else:
session["arrived_from_preview_page"] = False

View File

@@ -77,6 +77,11 @@ def invite_user(service_id, user_id=None):
form.login_authentication.data = "sms_auth"
if form.validate_on_submit():
if not form.permissions or len(form.permissions) == 0:
return render_template(
"views/user-has-no-permissions.html",
user_to_invite=user_to_invite,
)
email_address = form.email_address.data
invited_user = InvitedUser.create(
current_user.id,

View File

@@ -1,7 +1,7 @@
import base64
import json
import uuid
from datetime import datetime, timedelta
from urllib.parse import unquote
from flask import (
abort,
@@ -161,17 +161,29 @@ def set_up_your_profile():
debug_msg(f"Enter set_up_your_profile with request.args {request.args}")
code = request.args.get("code")
state = request.args.get("state")
state_key = f"login-state-{unquote(state)}"
stored_state = unquote(redis_client.get(state_key).decode("utf8"))
if state != stored_state:
current_app.logger.error(f"State Error: {state} != {stored_state}")
abort(403)
login_gov_error = request.args.get("error")
if redis_client.get(f"invitedata-{state}") is None:
access_token = sign_in._get_access_token(code, state)
user_email = redis_client.get(f"user_email-{state}")
user_uuid = redis_client.get(f"user_uuid-{state}")
new_user = user_email is None or user_uuid is None
if new_user: # invite path
access_token = sign_in._get_access_token(code)
debug_msg("Got the access token for login.gov")
user_email, user_uuid = sign_in._get_user_email_and_uuid(access_token)
debug_msg(
f"Got the user_email {user_email} and user_uuid {user_uuid} from login.gov"
)
invite_data = state.encode("utf8")
invite_data = base64.b64decode(invite_data)
invite_data = redis_client.get(f"invitedata-{state}")
invite_data = json.loads(invite_data)
debug_msg(f"final state {invite_data}")
invited_user_id = invite_data["invited_user_id"]
@@ -193,10 +205,7 @@ def set_up_your_profile():
form = SetupUserProfileForm()
if (
form.validate_on_submit()
and redis_client.get(f"invitedata-{state}") is not None
):
if form.validate_on_submit() and not new_user:
invite_data, user_email, user_uuid, invited_user_email_address = (
get_invite_data_from_redis(state)
)
@@ -221,6 +230,7 @@ def set_up_your_profile():
activate_user(user["id"])
debug_msg("activated user")
usr = User.from_id(user["id"])
usr.add_to_service(
invite_data["service_id"],
invite_data["permissions"],

View File

@@ -1,4 +1,4 @@
from flask import redirect
from flask import send_from_directory
from app.main import main
@@ -6,6 +6,4 @@ from app.main import main
@main.route("/.well-known/security.txt", methods=["GET"])
@main.route("/security.txt", methods=["GET"])
def security_policy():
# See GDS Way security policy which this implements
# https://gds-way.cloudapps.digital/standards/vulnerability-disclosure.html#vulnerability-disclosure-and-security-txt
return redirect("https://vdp.cabinetoffice.gov.uk/.well-known/security.txt")
return send_from_directory(".well-known", "security.txt")

View File

@@ -483,6 +483,7 @@ def send_one_off_step(service_id, template_id, step_index):
link_to_upload=(
request.endpoint == "main.send_one_off_step" and step_index == 0
),
errors=form.errors if form.errors else None,
)
@@ -739,7 +740,7 @@ def all_placeholders_in_session(placeholders):
def get_send_test_page_title(template_type, entering_recipient, name=None):
if entering_recipient:
return "Send {}".format(name)
return "Select recipients"
return "Personalize this message"
@@ -802,9 +803,15 @@ def get_skip_link(step_index, template):
)
@user_has_permissions("send_messages", restrict_admin_usage=True)
def send_one_off_to_myself(service_id, template_id):
db_template = current_service.get_template_with_user_permission_or_403(
template_id, current_user
)
current_app.logger.info("Send one off to myself")
try:
db_template = current_service.get_template_with_user_permission_or_403(
template_id, current_user
)
except Exception:
current_app.logger.exception("Couldnt get template for one off")
# Use 406 just because we're limited to certain codes here and it will point us back to a problem here
abort(406)
if db_template["template_type"] not in ("sms", "email"):
abort(404)
@@ -1009,9 +1016,16 @@ def _send_notification(service_id, template_id):
keys = []
values = []
# Guarantee that the real phone number comes last, because some
# users will have placeholders like "add your second phone number"
# or something like as custom placeholders.
for k, v in session["placeholders"].items():
keys.append(k)
values.append(v)
if k != "phone number":
keys.append(k)
values.append(v)
if "phone number" in session["placeholders"].keys():
keys.append("phone number")
values.append(session["placeholders"]["phone number"])
data = ",".join(keys)
vals = ",".join(values)
@@ -1027,7 +1041,7 @@ def _send_notification(service_id, template_id):
# on the API side to find out what happens to the message.
current_app.logger.info(
hilite(
f"One-off file: {filename} job_id: {upload_id} s3 location: service-{service_id}-notify/{upload_id}.csv"
f"One-off file: {filename} job_id: {upload_id} s3 location: {service_id}-service-notify/{upload_id}.csv"
)
)

View File

@@ -1,6 +1,8 @@
import os
import secrets
import time
import uuid
from urllib.parse import unquote
import jwt
import requests
@@ -16,19 +18,20 @@ from flask import (
)
from flask_login import current_user
from app import login_manager, user_api_client
from app import login_manager, redis_client, user_api_client
from app.main import main
from app.main.views.index import error
from app.main.views.verify import activate_user
from app.models.user import User
from app.utils import hide_from_search_engines
from app.utils.login import is_safe_redirect_url
from app.utils.time import is_less_than_days_ago
from app.utils.login import get_id_token, is_safe_redirect_url
# from app.utils.time import is_less_than_days_ago
from app.utils.user import is_gov_user
from notifications_utils.url_safe_token import generate_token
def _reformat_keystring(orig):
def _reformat_keystring(orig): # pragma: no cover
arr = orig.split("-----")
begin = arr[1]
end = arr[3]
@@ -37,7 +40,7 @@ def _reformat_keystring(orig):
return new_keystring
def _get_access_token(code, state):
def _get_access_token(code): # pragma: no cover
client_id = os.getenv("LOGIN_DOT_GOV_CLIENT_ID")
access_token_url = os.getenv("LOGIN_DOT_GOV_ACCESS_TOKEN_URL")
keystring = os.getenv("LOGIN_PEM")
@@ -60,17 +63,28 @@ def _get_access_token(code, state):
url = f"{base_url}{cli_assert}&{cli_assert_type}&{code_param}&grant_type=authorization_code"
headers = {"Authorization": "Bearer %s" % token}
response = requests.post(url, headers=headers)
if response.json().get("access_token") is None:
# Capture the response json here so it hopefully shows up in error reports
current_app.logger.error(
response_json = response.json()
id_token = get_id_token(response_json)
nonce = id_token["nonce"]
nonce_key = f"login-nonce-{unquote(nonce)}"
stored_nonce = redis_client.get(nonce_key).decode("utf8")
if nonce != stored_nonce:
current_app.logger.error(f"Nonce Error: {nonce} != {stored_nonce}")
abort(403)
try:
access_token = response_json["access_token"]
except KeyError as e:
current_app.logger.exception(
f"Error when getting access token {response.json()} #notify-admin-1505"
)
raise KeyError(f"'access_token' {response.json()}")
access_token = response.json()["access_token"]
raise KeyError(f"'access_token' {response.json()}") from e
return access_token
def _get_user_email_and_uuid(access_token):
def _get_user_email_and_uuid(access_token): # pragma: no cover
headers = {"Authorization": "Bearer %s" % access_token}
user_info_url = os.getenv("LOGIN_DOT_GOV_USER_INFO_URL")
user_attributes = requests.get(
@@ -82,10 +96,11 @@ def _get_user_email_and_uuid(access_token):
return user_email, user_uuid
def _do_login_dot_gov():
def _do_login_dot_gov(): # $ pragma: no cover
# start login.gov
code = request.args.get("code")
state = request.args.get("state")
login_gov_error = request.args.get("error")
if login_gov_error:
@@ -94,10 +109,19 @@ def _do_login_dot_gov():
)
raise Exception(f"Could not login with login.gov {login_gov_error}")
elif code and state:
verify_key = f"login-verify_email-{unquote(state)}"
verify_path = bool(redis_client.get(verify_key))
if not verify_path:
state_key = f"login-state-{unquote(state)}"
stored_state = unquote(redis_client.get(state_key).decode("utf8"))
if state != stored_state:
current_app.logger.error(f"State Error: {state} != {stored_state}")
abort(403)
# activate the user
try:
access_token = _get_access_token(code, state)
access_token = _get_access_token(code)
user_email, user_uuid = _get_user_email_and_uuid(access_token)
if not is_gov_user(user_email):
current_app.logger.error(
@@ -111,12 +135,17 @@ def _do_login_dot_gov():
f"Retrieved user {user['id']} from db #notify-admin-1505"
)
# Check if the email needs to be revalidated
is_fresh_email = is_less_than_days_ago(
user["email_access_validated_at"], 90
)
if not is_fresh_email:
return verify_email(user, redirect_url)
# Temporary disabling of this until we figure out what is happening.
# # Check if the email needs to be revalidated
# is_fresh_email = is_less_than_days_ago(
# user["email_access_validated_at"], 90
# )
# if not is_fresh_email:
# # send email verify
# ttl = 24 * 60 * 60
# verify_key = f"login-verify_email-{unquote(state)}"
# redis_client.set(verify_key, state, ex=ttl)
# return verify_email(user, redirect_url)
usr = User.from_email_address(user["email_address"])
current_app.logger.info(f"activating user {usr.id} #notify-admin-1505")
@@ -124,12 +153,13 @@ def _do_login_dot_gov():
except BaseException as be: # noqa B036
current_app.logger.error(f"Error signing in: {be} #notify-admin-1505 ")
error(401)
return redirect(url_for("main.show_accounts_or_dashboard", next=redirect_url))
# end login.gov
def verify_email(user, redirect_url):
def verify_email(user, redirect_url): # pragma: no cover
user_api_client.send_verify_code(user["id"], "email", None, redirect_url)
title = "Email resent" if request.args.get("email_resent") else "Check your email"
redirect_url = request.args.get("next")
@@ -138,7 +168,7 @@ def verify_email(user, redirect_url):
)
def _handle_e2e_tests(redirect_url):
def _handle_e2e_tests(redirect_url): # pragma: no cover
try:
current_app.logger.warning("E2E TESTS ARE ENABLED.")
current_app.logger.warning(
@@ -146,26 +176,32 @@ def _handle_e2e_tests(redirect_url):
)
user = user_api_client.get_user_by_email(os.getenv("NOTIFY_E2E_TEST_EMAIL"))
activate_user(user["id"])
# Check if the redirect URL is present and safe before proceeding further
if redirect_url and is_safe_redirect_url(redirect_url):
return redirect(redirect_url)
return redirect(
url_for(
"main.show_accounts_or_dashboard",
next="EMAIL_IS_OK",
)
)
except Exception as e:
stre = str(e)
stre = stre.replace(" ", "_")
# Trying to get a message back to playwright somehow since we can't see the admin logs
# Trying to get a message back to playwright somehow since we can't raise an error
return redirect(url_for(f"https://{stre}"))
@main.route("/sign-in", methods=(["GET", "POST"]))
@hide_from_search_engines
def sign_in():
def sign_in(): # pragma: no cover
redirect_url = request.args.get("next")
if os.getenv("NOTIFY_E2E_TEST_EMAIL"):
return _handle_e2e_tests(None)
return _handle_e2e_tests(redirect_url)
# If we have to revalidated the email, send the message
# via email and redirect to the "verify your email page"
@@ -183,16 +219,26 @@ def sign_in():
return redirect(redirect_url)
return redirect(url_for("main.show_accounts_or_dashboard"))
token = generate_token(
ttl = 24 * 60 * 60
state = generate_token(
str(request.remote_addr),
current_app.config["SECRET_KEY"],
current_app.config["DANGEROUS_SALT"],
)
state_key = f"login-state-{unquote(state)}"
redis_client.set(state_key, state, ex=ttl)
nonce = secrets.token_urlsafe()
nonce_key = f"login-nonce-{unquote(nonce)}"
redis_client.set(nonce_key, nonce, ex=ttl)
url = os.getenv("LOGIN_DOT_GOV_INITIAL_SIGNIN_URL")
# handle unit tests
if url is not None:
url = url.replace("NONCE", token)
url = url.replace("STATE", token)
url = url.replace("NONCE", nonce)
url = url.replace("STATE", state)
return render_template(
"views/signin.html",
again=bool(redirect_url),
@@ -201,5 +247,5 @@ def sign_in():
@login_manager.unauthorized_handler
def sign_in_again():
def sign_in_again(): # pragma: no cover
return redirect(url_for("main.sign_in", next=request.path))

View File

@@ -1,60 +1,67 @@
def features_nav():
def using_notify_nav():
nav_items = [
{"name": "Get started", "link": "main.get_started"},
{
"name": "Best practices",
"link": "main.best_practices",
"sub_navigation_items": [
{
"name": "Clear goals",
"link": "main.clear_goals",
},
{
"name": "Rules and regulations",
"link": "main.rules_and_regulations",
},
{
"name": "Establish trust",
"link": "main.establish_trust",
},
{
"name": "Write for action",
"link": "main.write_for_action",
},
{
"name": "Multiple languages",
"link": "main.multiple_languages",
},
{
"name": "Benchmark performance",
"link": "main.benchmark_performance",
},
],
},
{"name": "Trial mode", "link": "main.trial_mode_new"},
{"name": "Tracking usage", "link": "main.pricing"},
{"name": "Delivery status", "link": "main.message_status"},
{"name": "How to", "link": "main.how_to"},
]
return nav_items
def about_notify_nav():
return [
{
"name": "Features",
"link": "main.features",
"name": "About Notify",
"link": "main.about_notify",
"sub_navigation_items": [
# {
# "name": "Text messages",
# "link": "main.features_sms",
# },
{
"name": "Why text messaging",
"link": "main.why_text_messaging",
},
{
"name": "Security",
"link": "main.about_security",
},
],
},
{
"name": "Roadmap",
"link": "main.roadmap",
"name": "Join Notify",
"link": "main.join_notify",
},
{
"name": "Security",
"link": "main.security",
},
]
def using_notify_nav():
return [
{
"name": "Get started",
"link": "main.get_started",
},
{
"name": "Trial mode",
"link": "main.trial_mode_new",
},
{
"name": "Tracking usage",
"link": "main.pricing",
},
{
"name": "Delivery status",
"link": "main.message_status",
},
{
"name": "Guidance",
"link": "main.guidance_index",
# "sub_navigation_items": [
# {
# "name": "Formatting",
# "link": "main.edit_and_format_messages",
# },
# {
# "name": "Send files by email",
# "link": "main.send_files_by_email",
# },
# ]
# {
# "name": "API documentation",
# "link": "main.documentation",
# },
"name": "Contact us",
"link": "main.contact",
},
]

View File

@@ -201,7 +201,7 @@ class User(JSONModel, UserMixin):
@property
def is_gov_user(self):
is_gov = is_gov_user(self.email_address)
current_app.logger.info(f"User {self.id} is_gov_user: {is_gov}")
# current_app.logger.info(f"User {self.id} is_gov_user: {is_gov}")
return is_gov
@property
@@ -210,9 +210,9 @@ class User(JSONModel, UserMixin):
@property
def platform_admin(self):
current_app.logger.warn(
f"Checking User {self.id} for platform admin: {self._platform_admin}"
)
# current_app.logger.warning(
# f"Checking User {self.id} for platform admin: {self._platform_admin}"
# )
return self._platform_admin and not session.get(
"disable_platform_admin_view", False
)
@@ -242,26 +242,31 @@ class User(JSONModel, UserMixin):
# we shouldn't have any pages that require permissions, but don't specify a service or organization.
# use @user_is_platform_admin for platform admin only pages
# raise NotImplementedError
current_app.logger.warn(f"VIEW ARGS ARE {request.view_args}")
# current_app.logger.warning(f"VIEW ARGS ARE {request.view_args}")
pass
log_msg = f"has_permissions user: {self.id} service: {service_id}"
# platform admins should be able to do most things (except eg send messages, or create api keys)
if self.platform_admin and not restrict_admin_usage:
current_app.logger.warn(f"{log_msg} true because user is platform_admin")
current_app.logger.debug(
"has_permissions is true because user is platform_admin"
)
return True
if org_id:
value = self.belongs_to_organization(org_id)
current_app.logger.warn(f"{log_msg} org: {org_id} returning {value}")
current_app.logger.debug(
f"has_permissions returns org: {org_id} returning {value}"
)
return value
if not permissions and self.belongs_to_service(service_id):
current_app.logger.warn(f"{log_msg} True because belongs_to_service")
current_app.logger.debug("has_permissions True because belongs_to_service")
return True
if any(self.permissions_for_service(service_id) & set(permissions)):
current_app.logger.warn(f"{log_msg} permissions valid")
current_app.logger.debug(
"has_permissions returns True because permissions valid"
)
return True
from app.models.service import Service
@@ -269,7 +274,7 @@ class User(JSONModel, UserMixin):
org_value = allow_org_user and self.belongs_to_organization(
Service.from_id(service_id).organization_id
)
current_app.logger.warn(f"{log_msg} returning {org_value}")
current_app.logger.debug(f"has_permissions returning {org_value}")
return org_value
def permissions_for_service(self, service_id):
@@ -277,7 +282,7 @@ class User(JSONModel, UserMixin):
def has_permission_for_service(self, service_id, permission):
has_permission = permission in self.permissions_for_service(service_id)
current_app.logger.warn(
current_app.logger.debug(
f"has_permission_for_service user: {self.id} service: {service_id} "
f"permission: {permission} retuning {has_permission}"
)
@@ -558,17 +563,17 @@ class InvitedUser(JSONModel):
return cls.by_id(invited_user_id) if invited_user_id else None
def has_permissions(self, *permissions):
current_app.logger.warn(
f"Checking invited user {self.id} for permissions: {permissions}"
)
# current_app.logger.warning(
# f"Checking invited user {self.id} for permissions: {permissions}"
# )
if self.status == "cancelled":
return False
return set(self.permissions) > set(permissions)
def has_permission_for_service(self, service_id, permission):
current_app.logger.warn(
f"Checking invited user {self.id} for permission: {permission} on service {service_id}"
)
# current_app.logger.warn(
# f"Checking invited user {self.id} for permission: {permission} on service {service_id}"
# )
if self.status == "cancelled":
return False
return self.service == service_id and permission in self.permissions

View File

@@ -40,19 +40,21 @@ class HeaderNavigation(Navigation):
"support": {
"support",
},
"features": {
"features",
"features_sms",
"roadmap",
"security",
"best_practices": {
"best_practices",
"clear_goals",
"rules_and_regulations",
"establish_trust",
"write_for_action",
"multiple_languages",
"benchmark_performance",
},
"using_notify": {
"get_started",
"using_notify",
"pricing",
"trial_mode_new",
"message_status",
"guidance_index",
"how_to",
},
"accounts-or-dashboard": {
"conversation",

View File

@@ -1,3 +1,6 @@
import json
from app.extensions import redis_client
from app.notify_client import NotifyAdminAPIClient
@@ -15,10 +18,19 @@ class BillingAPIClient(NotifyAdminAPIClient):
)
def get_free_sms_fragment_limit_for_year(self, service_id, year=None):
frag_limit = redis_client.get(f"free-sms-fragment-limit-{service_id}-{year}")
if frag_limit is not None:
return json.loads(frag_limit.decode("utf-8"))
result = self.get(
"/service/{0}/billing/free-sms-fragment-limit".format(service_id),
params=dict(financial_year_start=year),
)
redis_client.set(
f"free-sms-fragment-limit-{service_id}-{year}",
json.dumps(result["free_sms_fragment_limit"]),
ex=30,
)
return result["free_sms_fragment_limit"]
def create_or_update_free_sms_fragment_limit(

View File

@@ -1,8 +1,16 @@
import json
import secrets
from urllib.parse import unquote
from flask import current_app, request
from app import redis_client
from app.notify_client import NotifyAdminAPIClient, _attach_current_user, cache
from app.utils.user_permissions import (
all_ui_permissions,
translate_permissions_from_ui_to_db,
)
from notifications_utils.url_safe_token import generate_token
class InviteApiClient(NotifyAdminAPIClient):
@@ -32,8 +40,35 @@ class InviteApiClient(NotifyAdminAPIClient):
"folder_permissions": folder_permissions,
}
data = _attach_current_user(data)
ttl = 24 * 60 * 60
# make and store the state
state = generate_token(
str(request.remote_addr),
current_app.config["SECRET_KEY"],
current_app.config["DANGEROUS_SALT"],
)
state_key = f"login-state-{unquote(state)}"
redis_client.set(state_key, state, ex=ttl)
# make and store the nonce
nonce = secrets.token_urlsafe()
nonce_key = f"login-nonce-{unquote(nonce)}"
redis_client.set(nonce_key, nonce, ex=ttl) # save the nonce to redis.
data["nonce"] = nonce # This is passed to api for the invite url.
data["state"] = state # This is passed to api for the invite url.
resp = self.post(url=f"/service/{service_id}/invite", data=data)
return resp["data"]
resp_data = resp["data"]
invite_data_key = f"invitedata-{unquote(state)}"
redis_invite_data = resp["invite"]
redis_invite_data = json.dumps(redis_invite_data)
redis_client.set(invite_data_key, redis_invite_data, ex=ttl)
return resp_data
def get_invites_for_service(self, service_id):
return self.get(f"/service/{service_id}/invite")["data"]
@@ -64,7 +99,34 @@ class InviteApiClient(NotifyAdminAPIClient):
self.post(url=f"/service/{service_id}/invite/{invited_user_id}", data=data)
def resend_invite(self, service_id, invited_user_id):
self.post(url=f"/service/{service_id}/invite/{invited_user_id}/resend", data={})
ttl = 24 * 60 * 60
# make and store the state
state = generate_token(
str(request.remote_addr),
current_app.config["SECRET_KEY"],
current_app.config["DANGEROUS_SALT"],
)
state_key = f"login-state-{unquote(state)}"
redis_client.set(state_key, state, ex=ttl)
# make and store the nonce
nonce = secrets.token_urlsafe()
nonce_key = f"login-nonce-{unquote(nonce)}"
redis_client.set(nonce_key, nonce, ex=ttl)
data = {
"nonce": nonce,
"state": state,
}
resp = self.post(
url=f"/service/{service_id}/invite/{invited_user_id}/resend", data=data
)
invite_data_key = f"invitedata-{unquote(state)}"
redis_invite_data = resp["invite"]
redis_invite_data = json.dumps(redis_invite_data)
redis_client.set(invite_data_key, redis_invite_data, ex=ttl)
@cache.delete("service-{service_id}")
@cache.delete("user-{invited_user_id}")

View File

@@ -1,3 +1,4 @@
import json
from datetime import datetime, timezone
from app.extensions import redis_client
@@ -517,7 +518,18 @@ class ServiceAPIClient(NotifyAdminAPIClient):
return int(count)
def get_global_notification_count(self, service_id):
return self.get("/service/{}/notification-count".format(service_id))
notification_count = redis_client.get(f"notification-count-{service_id}")
if notification_count is not None:
return json.loads(notification_count.decode("utf-8"))
notification_count = self.get(
"/service/{}/notification-count".format(service_id)
)
redis_client.set(
f"notification-count-{service_id}", json.dumps(notification_count), ex=30
)
return notification_count
def get_service_invite_data(self, redis_key):
"""

View File

@@ -116,7 +116,7 @@ class UserApiClient(NotifyAdminAPIClient):
data["next"] = next_string
if code_type == "email":
data["email_auth_link_host"] = self.admin_url
endpoint = "/user/{0}/{1}-code".format(user_id, code_type)
endpoint = f"/user/{user_id}/{code_type}-code"
current_app.logger.warn(hilite(f"Sending verify_code {code_type} to {user_id}"))
self.post(endpoint, data=data)
@@ -168,7 +168,7 @@ class UserApiClient(NotifyAdminAPIClient):
@cache.delete("user-{user_id}")
def add_user_to_service(self, service_id, user_id, permissions, folder_permissions):
# permissions passed in are the combined UI permissions, not DB permissions
endpoint = "/service/{}/users/{}".format(service_id, user_id)
endpoint = f"/service/{service_id}/users/{user_id}"
data = {
"permissions": [
{"permission": x}

View File

@@ -29,7 +29,10 @@ def get_s3_object(
aws_secret_access_key=secret_key,
region_name=region,
)
s3 = session.resource("s3", config=AWS_CLIENT_CONFIG)
s3 = session.resource(
"s3",
config=AWS_CLIENT_CONFIG,
)
obj = s3.Object(bucket_name, filename)
# This 'proves' that use of moto in the relevant tests in test_send.py
# mocks everything related to S3. What you will see in the logs is:

View File

@@ -1,3 +1,4 @@
import os
import uuid
from flask import current_app
@@ -10,13 +11,13 @@ from app.s3_client import (
)
from notifications_utils.s3 import s3upload as utils_s3upload
FILE_LOCATION_STRUCTURE = "service-{}-notify/{}.csv"
NEW_FILE_LOCATION_STRUCTURE = "{}-service-notify/{}.csv"
def get_csv_location(service_id, upload_id):
return (
current_app.config["CSV_UPLOAD_BUCKET"]["bucket"],
FILE_LOCATION_STRUCTURE.format(service_id, upload_id),
NEW_FILE_LOCATION_STRUCTURE.format(service_id, upload_id),
current_app.config["CSV_UPLOAD_BUCKET"]["access_key_id"],
current_app.config["CSV_UPLOAD_BUCKET"]["secret_access_key"],
current_app.config["CSV_UPLOAD_BUCKET"]["region"],
@@ -33,6 +34,14 @@ def s3upload(service_id, filedata):
bucket_name, file_location, access_key, secret_key, region = get_csv_location(
service_id, upload_id
)
if bucket_name == "":
exp_bucket = current_app.config["CSV_UPLOAD_BUCKET"]["bucket"]
exp_region = current_app.config["CSV_UPLOAD_BUCKET"]["region"]
tier = os.getenv("NOTIFY_ENVIRONMENT")
raise Exception(
f"NO BUCKET NAME SHOULD BE: {exp_bucket} WITH REGION {exp_region} TIER {tier}"
)
utils_s3upload(
filedata=filedata["data"],
region=region,

View File

@@ -6,9 +6,7 @@
<html lang="{{ htmlLang | default('en') }}" class="{{ htmlClasses }}">
<head>
<title>
{% block pageTitle %}
{% block per_page_title %}{% endblock %} Notify.gov
{% endblock %}
{% block pageTitle %}{% block per_page_title %}{% endblock %} Notify.gov{% endblock %}
</title>
{% include "components/head.html" %}
</head>
@@ -53,9 +51,36 @@
<div class="grid-row">
{% if navigation_links %}
<div class="tablet:grid-col-2 margin-bottom-4">
{{ sub_navigation(navigation_links) }}
<nav class="nav">
<ul class="usa-sidenav">
{% for item in navigation_links %}
<li class="usa-sidenav__item">
<a href="{{ url_for(item.link) }}"
class="parent-link {% if request.endpoint.startswith(item['link']) or item.sub_navigation_items | selectattr('link', 'equalto', request.endpoint) | list | length > 0 %} usa-current {% endif %}"
aria-haspopup="true"
aria-expanded="{{ 'true' if request.endpoint.startswith(item['link']) else 'false' }}">
{{ item.name }}
</a>
{% if item.sub_navigation_items %}
<ul class="usa-sidenav__sublist" role="menu">
{% for sub_item in item.sub_navigation_items %}
<li role="menuitem">
<a href="{{ url_for(sub_item.link.split('#')[0]) }}#{{ sub_item.link.split('#')[1] }}"
class="{% if request.endpoint == sub_item['link'] %}usa-current bold{% endif %}">
{{ sub_item.name }}
</a>
</li>
{% endfor %}
</ul>
{% endif %}
</li>
{% endfor %}
</ul>
</nav>
</div>
<div class="tablet:grid-col-10 padding-left-4 usa-prose site-prose">
<div class="tablet:grid-col-10 tablet:padding-left-4 usa-prose site-prose">
{% else %}
<div class="tablet:grid-col-10">
{% endif %}
@@ -82,7 +107,7 @@
{% if current_user.is_authenticated %}
{% block sessionUserWarning %}
<dialog class="usa-modal" id="sessionTimer" aria-labelledby="sessionTimerHeading" aria-describedby="timerWarning">
<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">

View File

@@ -1,2 +1,4 @@
<a href="{%- if params.href %}{{ params.href }}{% else %}#{% endif -%}" class="usa-link usa-back-link display-inline-flex margin-bottom-3 {%- if params.classes %} {{ params.classes }}{% endif -%}"
{%- for attribute, value in params.attributes %} {{attribute}}="{{value}}"{% endfor %}>{{ (params.html | safe if params.html else (params.text if params.text else 'Back')) }}</a>
<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>
</nav>

View File

@@ -1,7 +1,3 @@
<a href="{{ params.href | default('#content') }}" class="usa-skipnav{%- if params.classes %} {{ params.classes }}{% endif -%}"{%- for attribute, value in params.attributes %} {{ attribute }}="{{ value }}"{% endfor %}>
{{- params.html | safe if params.html else params.text -}}
</a>
<a class="usa-skipnav " href="#main-content">
Skip to main content
</a>

View File

@@ -4,9 +4,9 @@
template_type,
current_user,
link_current_item=False,
root_element='h1'
root_element='nav'
) %}
<{{ root_element }} class="font-body-lg folder-heading margin-bottom-0"{% if root_element == 'h1' %} id="page-header"{% endif %}>
<{{ root_element }} id="breadcrumb-template-folders" class="navigation-service usa-breadcrumb padding-top-0 padding-bottom-05" aria-label="Template folder path">
{% for folder in folders %}
{% if loop.last and not link_current_item %}
{% if folder.template_type or not folder.id %}
@@ -22,7 +22,10 @@
<span class="folder-heading-folder">{{ folder.name }}</span>
{% endif %}
{% else %}
<a href="{{ url_for('.choose_template', service_id=service_id, template_type=template_type) }}" title="Templates" class="usa-link {% if loop.length > 2 %}folder-heading-folder-root-truncated{% endif %}">Templates</a>
<a href="{{ url_for('.choose_template', service_id=service_id, template_type=template_type) }}" class="usa-link {% if loop.length > 2 %}folder-heading-folder-root-truncated{% endif %}">
<span class="usa-sr-only">Return to all</span>
Templates
</a>
{% endif %}
{% if not loop.last %}{{ folder_path_separator() }}{% endif %}
{% endif %}

View File

@@ -32,6 +32,9 @@
<li class="usa-identifier__required-links-item">
<a href="https://www.gsa.gov/about-us" class="usa-identifier__required-link">About GSA</a>
</li>
<li class="usa-identifier__required-links-item">
<a href="/studio" class="usa-identifier__required-link">About the Public Benefits Studio</a>
</li>
<li class="usa-identifier__required-links-item">
<a href="https://www.gsa.gov/website-information/accessibility-aids"
class="usa-identifier__required-link">Accessibility support</a>
@@ -51,6 +54,9 @@
<a href="https://www.gsa.gov/reference/reports/budget-performance"
class="usa-identifier__required-link">Performance reports</a>
</li>
<li class="usa-identifier__required-links-item">
<a href="/acceptable-use-policy" class="usa-identifier__required-link">Acceptable use policy</a>
</li>
<li class="usa-identifier__required-links-item">
<a href="https://www.gsa.gov/website-information/website-policies"
class="usa-identifier__required-link">Privacy policy</a>
@@ -58,16 +64,20 @@
</ul>
</div>
</nav>
<section class="usa-identifier__section usa-identifier__section--usagov"
<section class="usa-identifier__section"
aria-label="Github Repos">
<div class="usa-identifier__container">
<div class="usa-identifier__required-links-item">
Find us on Github:
</div>
<ul>
<li><a href="https://github.com/gsa/notifications-admin" class="usa-identifier__required-link">Notify.gov Admin repo</a></li>
<li><a href="https://github.com/gsa/notifications-api" class="usa-identifier__required-link">Notify.gov API repo</a></li>
</ul>
<ul class="usa-identifier__required-links-list">
<li class="usa-identifier__required-links-item">
<a href="https://github.com/gsa/notifications-admin" class="usa-identifier__required-link">Notify.gov Admin repo</a>
</li>
<li class="usa-identifier__required-links-item">
<a href="https://github.com/gsa/notifications-api" class="usa-identifier__required-link">Notify.gov API repo</a>
</li>
</ul>
</div>
</section>

View File

@@ -0,0 +1,44 @@
<ul class="usa-card-group grid-row flex-row">
{% for item in card_contents %}
<li class="usa-card grid-col mobile-lg:grid-col-12 tablet:grid-col-6 desktop:grid-col-4 {% if item.link %}linked-card linked-content{% endif %}">
{% if item.link %}
<a href="{{ item.link }}">
{% endif %}
<div class="usa-card__container">
{% if item.card_heading %}
<div class="usa-card__header">
<h3
class="usa-card__heading {% if text_align != 'left' or text_align is not defined %}text-center{% else %}text-left{% endif %} {% if item.link %}linked-card{% endif %}">
{{ item.card_heading }}
</h3>
{% if item.link %}
{% endif %}
</div>
{% endif %}
{% if item.svg_src or item.image_src%}
<div class="usa-card__media usa-card__media--inset">
{% if item.svg_src %}
<svg aria-hidden="true" focusable="false" role="img" class="best-practices_card_img">
<use xlink:href="{{asset_url('images/best-practices-card-sprite.svg')}}#{{item.svg_src}}"></use>
</svg>
{% endif %}
{% if item.image_src %}
<img class="best-practices_card_img" src="{{item.image_src}}" alt="{{ item.alt_text }}" />
{% endif %}
</div>
{% endif %}
{% if item.p_text %}
<div class="usa-card__body">
<p
class="{% if text_align != 'left' or text_align is not defined %}text-center{% else %}text-left{% endif %} {% if item.link %}linked-card{% endif %}">
{{item.p_text|safe}}
</p>
</div>
{% endif %}
</div>
{% if item.link %}
</a>
{% endif %}
</li>
{% endfor %}
</ul>

View File

@@ -0,0 +1,9 @@
{% macro circle_number(number) %}
<svg xmlns="http://www.w3.org/2000/svg" class="svg-circle-icon" width="24" height="24" viewBox="0 0 100 100">
<circle cx="50" cy="50" r="37" stroke="#005ea2" stroke-width="7" fill="none" />
<text x="50%" y="50%" text-anchor="middle" font-size="40" font-weight="bolder" fill="#005ea2" font-family="Arial"
dy=".35em">
{{ number }}
</text>
</svg>
{% endmacro %}

View File

@@ -1,49 +1,76 @@
{% set is_about_page = request.path.startswith('/about') %}
{% set is_join_notify_page = request.path.startswith('/join-notify') %}
{% set is_contact_page = request.path.startswith('/contact') %}
{% set is_information_section = is_about_page or is_join_notify_page or is_contact_page %}
{% if current_user.is_authenticated %}
{% set navigation = [
{"href": url_for("main.show_accounts_or_dashboard"), "text": "Current service", "active": header_navigation.is_selected('accounts-or-dashboard')},
{"href": url_for('main.get_started'), "text": "Using Notify", "active": header_navigation.is_selected('using_notify')},
{"href": url_for('main.features'), "text": "Features", "active": header_navigation.is_selected('features')},
{"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.join_notify'), "text": "Join Notify", "active": is_join_notify_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">
<div class="usa-logo display-flex flex-align-center flex-justify" id="-logo">
<div class="logo-img display-flex">
<a href="/">
<span class="usa-sr-only">Notify.gov logo</span>
<img src="{{ (asset_path | default('/static')) + 'images/notify-logo.svg' }}" alt="Notify.gov logo" class="usa-flag-logo margin-right-1">
<div class="display-flex flex-align-center flex-justify width-full">
<div class="usa-logo display-flex flex-align-center flex-justify" id="-logo">
<div class="logo-img display-flex">
<a href="/">
<span class="usa-sr-only">Notify.gov logo</span>
<img src="{{ (asset_path | default('/static')) + 'images/notify-logo.svg' }}" alt="Notify.gov logo"
class="usa-flag-logo margin-right-1">
</a>
</div>
{% if navigation %}
<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>
{% if navigation %}
<button type="button" class="usa-menu-btn">Menu</button>
{% endif %}
</div>
</div>
<nav aria-label="Primary navigation" class="usa-nav">
<div class="usa-nav__inner">
@@ -52,32 +79,33 @@
</button>
<ul class="usa-nav__primary usa-accordion margin-right-1">
{% for item in navigation %}
{% if item.href and item.text %}
<li class="usa-nav__primary-item{{ ' is-current' if item.active }}">
<a class="usa-nav__link {{ ' usa-current' if item.active }}" href="{{ item.href }}" {% for attribute, value in
item.attributes %} {{attribute}}="{{value}}" {% endfor %}>
<span>{{ item.text }}</span>
</a>
</li>
{% endif %}
{% if item.href and item.text %}
<li class="usa-nav__primary-item{{ ' is-current' if item.active }}">
<a class="usa-nav__link {{ ' usa-current' if item.active }}" href="{{ item.href }}" {% for attribute, value
in item.attributes %} {{attribute}}="{{value}}" {% endfor %}>
<span>{{ item.text }}</span>
</a>
</li>
{% endif %}
{% endfor %}
</ul>
<div class="usa-nav__secondary margin-bottom-6">
<ul class="usa-nav__secondary-links">
{% if secondaryNavigation %}
{% for item in secondaryNavigation %}
{% if item.href and item.text %}
<li class="usa-nav__secondary-item{{ ' is-current' if item.active }}">
<a class="usa-nav__link {{ ' usa-current' if item.active }}" href="{{ item.href }}" {% for attribute, value in
item.attributes %} {{attribute}}="{{value}}" {% endfor %}>
<span>{{ item.text }}</span>
</a>
</li>
{% endif %}
{% endfor %}
{% for item in secondaryNavigation %}
{% if item.href and item.text %}
<li class="usa-nav__secondary-item{{ ' is-current' if item.active }}">
<a class="usa-nav__link {{ ' usa-current' if item.active }}" href="{{ item.href }}" {% for attribute,
value in item.attributes %} {{attribute}}="{{value}}" {% endfor %}>
<span>{{ item.text }}</span>
</a>
</li>
{% endif %}
{% endfor %}
{% endif %}
</ul>
</div>
</div>
</nav>
</div>

View File

@@ -17,7 +17,7 @@
{% endif %}
{% if show %}
<div class="live-search js-header" data-module="live-search" data-targets="{{ target_selector }}">
<div class="live-search js-header margin-top-0" data-module="live-search" data-targets="{{ target_selector }}">
{{ form.search(param_extensions=param_extensions) }}
<div aria-live="polite" class="live-search__status usa-sr-only"></div>
</div>

View File

@@ -1,7 +1,7 @@
{% if help %}
{% include 'partials/tour.html' %}
{% else %}
<nav class="nav margin-bottom-4">
<nav id="nav-main-nav" aria-label="Main navigation" class="nav margin-bottom-4">
<a class="usa-button margin-top-1 margin-bottom-5 width-full"
href="{{ url_for('.choose_template', service_id=current_service.id) }}">Send messages</a>
<ul class="usa-sidenav">

View File

@@ -0,0 +1,18 @@
{% macro breadcrumb(title, parent_menu_title, url) %}
<nav class="navigation-service usa-breadcrumb padding-top-0">
<ol class="usa-breadcrumb__list">
<li class="usa-breadcrumb__list-item">
<span class="usa-breadcrumb__label">
<a href="{{ url_for(url) }}" class="usa-link navigation-organization-link">
{{ parent_menu_title }}
</a>
</span>
</li>
{% if title %}
<li class="usa-breadcrumb__list-item">
<span class="usa-breadcrumb__label">{{ title }}</span>
</li>
{% endif %}
</ol>
</nav>
{% endmacro %}

View File

@@ -1,4 +1,4 @@
<nav class="nav margin-bottom-4">
<nav id="nav-org-nav" aria-label="Organization navigation" class="nav margin-bottom-4">
<ul class="usa-sidenav">
<li class="usa-sidenav__item"><a class="usa-link{{ org_navigation.is_selected('dashboard') }}" href="{{ url_for('.organization_dashboard', org_id=current_org.id) }}">Usage</a></li>
<li class="usa-sidenav__item"><a class="usa-link{{ org_navigation.is_selected('team-members') }}" href="{{ url_for('.manage_org_users', org_id=current_org.id) }}">Team members</a></li>

View File

@@ -1,3 +1,4 @@
<nav id="nav-service-nav" aria-label="Service navigation">
<div class="navigation-service margin-top-5 display-flex flex-align-end flex-justify border-bottom padding-bottom-1">
{% if current_service.organization_id %}
{% if current_user.platform_admin or
@@ -5,11 +6,12 @@
<a href="{{ url_for('.organization_dashboard', org_id=current_service.organization_id) }}" class="usa-link navigation-organization-link">{{ current_service.organization_name }}</a>
{% endif %}
{% endif %}
<div class="font-body-2xl text-bold">
<span>
{{ current_service.name }}
{% if not current_service.active %}
<span class="navigation-service-name navigation-service-type--suspended">Suspended</span>
{% endif %}
</div>
</span>
<a href="{{ url_for('main.choose_account') }}" class="usa-link">Switch service</a>
</div>
</nav>

View File

@@ -2,7 +2,7 @@
{% from "components/page-footer.html" import page_footer %}
{% from "components/form.html" import form_wrapper %}
<div class="ajax-block-container" aria-labelledby='pill-selected-item' role="region">
<div class="ajax-block-container" role="region">
{% if job.scheduled %}
<p class="usa-body">

View File

@@ -8,7 +8,7 @@
<div>
<ul class="usa-icon-list">
<li class="usa-icon-list__item">
<img src="{{ url_for('static', filename='img/material-icons/description.svg') }}" alt="Description Icon">
<img src="{{ url_for('static', filename='img/material-icons/description.svg') }}" alt="">
<div class="usa-icon-list__content">
<h3>{{ job.original_file_name }}</h3>
</div>
@@ -21,11 +21,11 @@
<div class="ajax-block-container">
<p class='bottom-gutter'>
{% if job.still_processing or arrived_from_preview_page_url %}
{% if not job.finished_processing %}
{% if job.scheduled_for %}
<div class="usa-alert usa-alert--info">
<div class="usa-alert__body">
<h4 class="usa-alert__heading">Your text has been scheduled</h4>
<h2 class="usa-alert__heading">Your message has been scheduled</h2>
<p class="usa-alert__text">
{{ job.template_name }} - {{ current_service.name }} was scheduled on {{ job.scheduled_for|format_datetime_normal }} by {{ job.created_by.name }}
</p>
@@ -33,18 +33,46 @@
</div>
{{display_message_status}}
{% else %}
<div class="usa-alert usa-alert--success">
<div class="usa-alert__body">
<h4 class="usa-alert__heading">Your text has been sent</h4>
<p class="usa-alert__text">
{{ job.template_name }} - {{ current_service.name }} was sent on {% if job.processing_started %}
{{ job.processing_started|format_datetime_table }} {% else %}
{{ job.created_at|format_datetime_table }} {% endif %} by {{ job.created_by.name }}
</p>
{% if job.processing_started %}
<div class="usa-alert usa-alert--success">
<div class="usa-alert__body">
<h2 class="usa-alert__heading">
Your message is sending
</h2>
<p class="usa-alert__text">
{{ job.template_name }} - {{ current_service.name }}
has been sending since {{job.processing_started| format_datetime_normal}} by {{ job.created_by.name }}
</p>
</div>
</div>
</div>
{% else %}
<div class="usa-alert usa-alert--info">
<div class="usa-alert__body">
<h2 class="usa-alert__heading">
Your message is pending
</h2>
<p class="usa-alert__text">
{{ job.template_name }} - {{ current_service.name }}
has been pending since {{job.created_at|format_datetime_normal}} by {{ job.created_by.name }}
</p>
</div>
</div>
{% endif %}
{{display_message_status}}
{% endif %}
{% elif arrived_from_preview_page_url %}
<div class="usa-alert usa-alert--success">
<div class="usa-alert__body">
<h2 class="usa-alert__heading">
Your message has been sent
</h2>
<p class="usa-alert__text">
{{ job.template_name }} - {{ current_service.name }}
was sent on {{job.processing_started|format_datetime_normal}} by {{ job.created_by.name }}
</p>
</div>
</div>
{{display_message_status}}
{% endif %}
</p>
{% if job.status == 'sending limits exceeded'%}

View File

@@ -0,0 +1,73 @@
{% extends "base.html" %}
{% set page_title = "About Notify" %}
{% block per_page_title %}
{{page_title}}
{% endblock %}
{% block content_column_content %}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p>Notify.gov is a text messaging service built by and for the government. We help agencies communicate more
effectively with the people they serve. With Notify.gov, federal and federally-funded programs can send customized
text messages that make it possible to:</p>
<ul>
<li>Meet people where they are</li>
<li>More effectively deliver program outcomes</li>
<li>Save administrative costs</li>
<li>Implement <a class="use-link usa-link--external"
href="https://digital.gov/resources/delivering-digital-first-public-experience/" target="_blank">21st Century
IDEA</a> and other directives</li>
</ul>
<p>Notify.gov is an easy-to-use, web-based platform. It requires no technical expertise or system integration — users
can create an account and get started within minutes. We take the security and privacy of messaging data seriously
by minimizing data retention and using modern encryption methods.</p>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/fkcy_xbo0Bw?si=qNo94BwL4WCeusy5&amp;start=2" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> <h2 class="padding-bottom-3">Product Highlights</h2>
{% set product_highlights = [
{
"svg_src": "#send",
"card_heading": "Send customized one-way messages",
"p_text": "Upload a file with recipient phone numbers and Notify.gov sends customized messages",
},
{
"svg_src": "#translate",
"card_heading": "Send in recipients preferred language",
"p_text": "Notify.gov supports more than 30 character sets to send messages in almost any language",
},
{
"svg_src": "#trending_up",
"card_heading": "See how messages perform",
"p_text": "Track how many messages youve sent and monitor delivery rates",
},
{
"svg_src": "#add",
"card_heading": "Create and manage multiple services within a single organization",
"p_text": "Set up individual workspaces for different texting services, allowing multiple teams or programs to manage
day-to-day texting operations across an organization",
},
{
"svg_src": "#people",
"card_heading": "Manage team member and permissions on each service",
"p_text": "Administrators can add users and control what they can do in Notify.gov",
}
] %}
<ul class="usa-icon-list">
{% for item in product_highlights %}
<li class="usa-icon-list__item">
<div class="usa-icon-list__content padding-left-0">
<div class="usa-icon-list__icon display-flex flex-align-start">
<svg aria-hidden="true" focusable="false" role="img" class="icon-list">
<use xlink:href="{{ asset_url('img/sprite.svg') }}{{ item.svg_src }}"></use>
</svg>
<b>{{item.card_heading}}</b>
</div>
<p class="indented-paragraph">{{item.p_text}}</p>
</div>
</li>
{% endfor %}
</ul>
<p><a href="/join-notify">See if Notify is right for you</a></p>
<p>Notify.gov is a product of the <a href="/studio">Public Benefits Studio</a>, a product accelerator inside
the federal government. </p>
</section>
{% endblock %}

View File

@@ -0,0 +1,68 @@
{% extends "base.html" %}
{% import "components/nav_breadcrumb.html" as breadcrumbs %}
{% set page_title = "Security" %}
{% block per_page_title %}
{{page_title}}
{% endblock %}
{% block content_column_content %}
{{ breadcrumbs.breadcrumb(page_title, "About", "main.about_notify") }}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p class="font-sans-lg text-base">Notify.gov is built for the needs of government agencies with fundamental system
security processes in place to:
</p>
<ul>
<li>protect user data</li>
<li>keep systems secure</li>
<li>manage risks around information</li>
</ul>
<p>
Notify.gov operates under a full three-year <a class="use-link usa-link--external"
href="https://digital.gov/resources/an-introduction-to-ato/" target="_blank">Authority-to-Operate (ATO)</a>. This
federal security authorization process leverages security
controls provided by National Institute of Standards and Technology (NIST).
</p>
<p>
Our infrastructure runs on <a class="use-link usa-link--external" href="https://www.cloud.gov/"
target="_blank">cloud.gov</a> and utilizes several
services through Amazon Web
Services (AWS), including <a class="use-link usa-link--external" href="https://aws.amazon.com/sns/" target="_blank">
AWS SNS </a> for sending SMS
messages.
</p>
<p>For more information about the Notify.gov infrastructure, contact us at <a
href="mailto:notify-support@gsa.gov">notify-support@gsa.gov</a>.</p>
<h2>Data</h2>
<p>
On Notify.gov, data is encrypted both in transit and at rest. To send a message, agencies upload a spreadsheet of
phone numbers and other necessary data from their existing data management system.
</p>
<p>
Notify.gov is not a system of record, so it does not have a System of Records Notice (SORN). Agencies are
responsible for managing their data outside of Notify.gov.
</p>
<h3>Data retention</h3>
<p>
Any data uploads that have recipient data are held for seven calendar days; personally identifiable information
(PII) is never stored in Notifys database.
</p>
<h2>Multi-Factor Authentication</h2>
<p>
Notify.gov uses <a class="use-link usa-link--external" href="https://login.gov/what-is-login/"
target="_blank">Login.gov</a> for enhanced security.
Login.gov is an extra layer of security created by the government that uses multi-factor authentication and stronger
passwords to protect your account.
</p>
<p>
To access Notify.gov, users will use a Login.gov account associated with their agency (.gov) email with one of the
<a class="use-link usa-link--external" href="https://login.gov/help/get-started/authentication-methods/"
target="_blank">multi-factor authentication
methods</a> offered through Login.gov.
</p>
</section>
{% endblock %}

View File

@@ -0,0 +1,89 @@
{% extends "base.html" %}
{% import "components/nav_breadcrumb.html" as breadcrumbs %}
{% set page_title = "Why text messaging" %}
{% block per_page_title %}
{{page_title}}
{% endblock %}
{% block content_column_content %}
{{ breadcrumbs.breadcrumb(page_title, "About", "main.about_notify") }}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<h2 id="reach-people-using-a-common-method">Reach people using a common method</h2>
<p>
Confusing or <a class="use-link usa-link--external"
href="https://kffhealthnews.org/news/tougher-returned-mail-policies-add-to-medicaid-enrollment-drop/"
target="_blank">unreceived notifications</a> are one of the largest barriers to people getting and keeping
benefits. The typical ways the government communicates with people often fall short. Low income households are more
likely to experience housing instability, which means paper mail, already slow, can easily be missed.
</p>
<p>
<a class="use-link usa-link--external"
href="https://www.pewresearch.org/internet/fact-sheet/mobile/?tabItem=64e32376-5a21-4b1d-8f8b-5f92406db984"
target="_blank">Pew Research shows that nearly all adults in the US have a cell phone.</a> Reliance on smartphones
for online access is especially common among Americans with lower household incomes and those with lower levels of
formal education. Of those earning less than $30,000 a year, 28% say their mobile phone is the sole method to
digitally connect.
</p>
<p>
This means that for many people who rely on government services, cell phones may be the most reliable place to meet
people where they already are.
</p>
<h2 id="improve-customer-experience">Improve customer experience</h2>
<p>
Text messages can deliver concise information and drive an audience to take action quickly. Timely reminders sent
via text message have been proven to decrease re-enrollment churn and save money for administering agencies.
</p>
<p>
Texting not only helps programs reach people using a nearly-universal communication method, it is a cost effective
way to do so. With Notify.gov <a href="/join-notify">you can get started for free</a>, allowing you to try out
texting to complement your existing communications and outreach strategies.
</p>
<h2 id="what-texting-is-best-for">What texting is best for</h2>
<p>
Agencies, like you, are already using Notify.gov to text about the following programs.
</p>
{% set card_contents = [
{
"image_src": asset_url('images/calendar.svg'),
"card_heading": "Reminders",
"p_text": "Your Quality Control food phone interview is on ((date)) at ((time)). Failure to
attend may lead to closure of your benefits. Call 1-800-222-3333 with questions.",
"alt_text": "reminder text example"
},
{
"image_src": asset_url('images/alert.svg'),
"card_heading": "Alerts to take action",
"p_text": "Your household's Medicaid coverage is expiring. To keep getting Medicaid, you must
complete your renewal by ((date)). You can renew online at dhs.state.gov…",
"alt_text": "alerts text example"
},
{
"image_src": asset_url('images/alarm.svg'),
"card_heading": "Important status updates",
"p_text": "Your passport has been issued at the Los Angeles Passport Agency. Please come to the
desk between 1:30pm and 2:30pm today to pick up your passport…",
"alt_text": "status update text example"
},
] %}
{% for item in card_contents %}
<div class="grid-container-tablet padding-3 radius-lg border-2px margin-left-0 ">
<h3 class="usa-card__heading padding-y-2">{{item.card_heading}}</h3>
<div class="grid-row grid-gap-3 flex-align-center">
<div class="grid-col-auto ">
<p class="sms-message-wrapper">{{item.p_text}}</p>
</div>
<div class="grid-col-fill">
{% if item.image_src %}
<img src="{{ item.image_src }}" alt="{{ item.alt_text }}" class="height-15" />
{% endif %}
</div>
</div>
</div>
{% endfor %}
</section>
{% endblock %}

View File

@@ -0,0 +1,38 @@
{% extends "base.html" %}
{% set page_title = "Acceptable Use Policy" %}
{% block per_page_title %}{{page_title}}{% endblock %}
{% block content_column_content %}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p>Use of the application indicates agreement with this acceptable use policy.</p>
<p>Acceptable uses of Notify.gov for this trial period include:</p>
<ul>
<li>Configuring test services and sending test SMS messages to learn and demonstrate how Notify.gov works.</li>
<li>Reviewing data provided by Notify.gov and configuring available settings.</li>
</ul>
<p>
In order to help us keep Notify.gov secure, we require that you use your account appropriately. When you use Notify.gov, you agree that youll respect these rules of behavior:
</p>
<ul>
<li>Conduct only authorized business on the system.</li>
<li>Maintain the confidentiality of your authentication credentials; a Notify.gov operator should never ask you to reveal them. We recommend using a password manager and strong credentials.</li>
<li>Log out when you no longer need session access. Never leave your computer unattended while logged into Notify.gov.</li>
<li>Report all security incidents or suspected incidents (such as improper or suspicious acts) related to Notify.gov systems and networks to Notify.gov support.</li>
<li>Safeguard system resources against waste, loss, abuse, unauthorized use or disclosure, and misappropriation.</li>
<li>Dont process U.S. classified national security information on the system.</li>
<li>Dont browse, search or reveal information hosted by Notify.gov except as required to perform your legitimate tasks or assigned duties.</li>
<li>Dont retrieve information, or in any other way disclose information, for someone who does not have authority to access that information.</li>
<li>Dont intentionally use a client that makes use of obsolete or insecure encryption algorithms.</li>
<li>Dont configure your browser to ignore security warnings which may involve your connection with Notify.gov; report warnings that you cant explain to Notify.gov support.</li>
<li>If you believe youve been granted more access than necessary to perform your legitimate tasks or assigned duties, immediately notify Notify.gov support.</li>
<li>Dont share your account with another person or create anonymous or group accounts. Your account is just for you.</li>
</ul>
<p>Access to systems and networks owned by Notify.gov is governed by, and subject to, all federal laws, including, but not limited to, the Privacy Act, 5 U.S.C. 552a, if the applicable Notify.gov system maintains individual Privacy Act information. Access to Notify.gov systems constitutes consent to the retrieval and disclosure of the information within the scope of your authorized access, subject to the Privacy Act, and applicable state and federal laws.</p>
<p>Please contact Notify.gov support if you have questions about these rules or dont understand them.</p>
</section>
{% endblock %}

View File

@@ -60,7 +60,7 @@
<h2 class="margin-top-4 margin-bottom-1">Sent jobs</h2>
<div class="usa-table-container--scrollable-mobile">
<table class="usa-table usa-table--compact job-table">
<caption></caption>
<caption class="usa-sr-only">Table showing all sent jobs for this service</caption>
<thead class="table-field-headings">
<tr>
<th scope="col" role="columnheader" class="table-field-heading-first" id="jobId">
@@ -90,7 +90,7 @@
{% if all_jobs_dict %}
{% for job in all_jobs_dict %}
<tr class="table-row">
<td class="table-field jobid" scope="row" role="rowheader">
<td class="table-field jobid" role="rowheader">
<a class="usa-link" href="{{ job.view_job_link }}">
{{ job.job_id[:8] if job.job_id else 'Manually entered number' }}
</a>
@@ -103,7 +103,10 @@
<td class="table-field sender">{{ job.created_by.name }}</td>
<td class="table-field report">
{% if job.time_left != "Data no longer available" %}
<a href="{{ job.download_link }}"><img src="{{ url_for('static', filename='img/material-icons/file_download.svg') }}" alt="File Download Icon"></a>
<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>
</a>
{% else %}
<span>N/A</span>
{% endif %}

View File

@@ -2,7 +2,6 @@
{% from "components/banner.html" import banner_wrapper %}
{% from "components/page-header.html" import page_header %}
{% from "components/components/button/macro.njk" import usaButton %}
{% from "components/components/skip-link/macro.njk" import usaSkipLink %}
{% from "components/components/back-link/macro.njk" import usaBackLink %}
{% set file_contents_header_id = 'file-preview' %}

View File

@@ -3,7 +3,6 @@
{% from "components/table.html" import list_table, field, text_field, hidden_field_heading %}
{% from "components/page-header.html" import page_header %}
{% from "components/components/button/macro.njk" import usaButton %}
{% from "components/components/skip-link/macro.njk" import usaSkipLink %}
{% from "components/components/back-link/macro.njk" import usaBackLink %}
{% set file_contents_header_id = 'file-preview' %}
@@ -34,7 +33,7 @@
<div>
<ul class="usa-icon-list">
<li class="usa-icon-list__item">
<img src="{{ url_for('static', filename='img/material-icons/description.svg') }}" alt="Description Icon">
<img src="{{ url_for('static', filename='img/material-icons/description.svg') }}" alt="">
<div class="usa-icon-list__content">
<h3>{{ original_file_name }}</h3>
</div>

View File

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

View File

@@ -0,0 +1,72 @@
<h2 class="line-height-sans-2 margin-bottom-0 margin-top-4">Recent activity</h2>
<div id="activityChartContainer">
<form class="usa-form">
<label class="usa-label" for="options">Account</label>
<select class="usa-select margin-bottom-2" name="options" id="options">
<option value disabled>- Select -</option>
<option value="service" selected>{{ current_service.name }}</option>
<option value="individual">{{ current_user.name }}</option>
</select>
</form>
<div id="activityChart">
<div class="chart-header">
<div class="chart-subtitle">{{ current_service.name }} - last 7 days</div>
<div class="chart-legend" role="region" aria-label="Legend"></div>
</div>
<div class="chart-container" id="weeklyChart"></div>
<table id="weeklyTable" class="usa-sr-only usa-table"></table>
</div>
</div>
<div id="aria-live-account" class="usa-sr-only" aria-live="polite"></div>
<div class="table-container" id="activityContainer" data-currentUserName="{{ current_user.name }}">
<div id="tableActivity" class="table-overflow-x-auto">
<h2 id="table-heading" class="margin-top-4 margin-bottom-1">Service activity</h2>
<table class="usa-table job-table" id="activity-table">
<caption class="usa-sr-only">Table showing the sent jobs for {{current_service.name}}</caption>
<thead class="table-field-headings">
<tr>
<th scope="col" class="table-field-heading-first" id="jobId">Job ID#</th>
<th data-sortable scope="col" class="table-field-heading" scope="col">Template</th>
<th data-sortable scope="col" class="table-field-heading">Job status</th>
<th data-sortable scope="col" role="columnheader" class="table-field-heading sender-column">Sender
</th>
<th data-sortable scope="col" class="table-field-heading"># of Recipients</th>
</tr>
</thead>
<tbody>
{% if jobs %}
{% for job in jobs %}
<tr id="{{ job.id }}">
<td class="table-field jobid" role="rowheader">
<a class="usa-link" href="{{ url_for('.view_job', service_id=current_service.id, job_id=job.id )}}">
{{ job.id[:8] if job.id else 'Manually entered number' }}
</a>
</td>
<td class="table-field template">{{ job.template_name }}</td>
<td class="table-field time-sent">
{% if job.scheduled_for and not job.processing_finished %}
Scheduled for {{ job.scheduled_for|format_datetime_table }}
{% elif job.processing_finished and not job.statistics|selectattr('status', 'equalto', 'sending')|list %}
Sent on {{ job.processing_finished|format_datetime_table }}
{% elif job.processing_started %}
Sending since {{ job.processing_started|format_datetime_table }}
{% else %}
Pending since {{ job.created_at|format_datetime_table }}
{% endif %}
</td>
<td class="table-field sender sender-column">{{ job.created_by.name }}</td>
<td class="table-field count-of-recipients">{{ job.notification_count }}</td>
</tr>
{% endfor %}
{% else %}
<tr class="table-row">
<td class="table-empty-message" colspan="10">No batched job messages found &thinsp;(messages are
kept for {{ service_data_retention_days }} days).</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
</div>

View File

@@ -6,138 +6,38 @@
{% from "components/ajax-block.html" import ajax_block %}
{% block service_page_title %}
Dashboard
Dashboard
{% endblock %}
{% block maincolumn_content %}
<script type="text/javascript" src="{{ asset_url('js/setTimezone.js') }}"></script>
<script type="text/javascript" src="{{ asset_url('js/setTimezone.js') }}"></script>
<div class="dashboard margin-bottom-2">
<div class="dashboard margin-top-0 margin-bottom-2">
<h1 class="usa-sr-only">Dashboard</h1>
{% if current_user.has_permissions('manage_templates') and not current_service.all_templates %}
{% include 'views/dashboard/write-first-messages.html' %}
{% endif %}
<h1 class="usa-sr-only">Dashboard</h1>
{% if current_user.has_permissions('manage_templates') and not current_service.all_templates %}
{% include 'views/dashboard/write-first-messages.html' %}
{% endif %}
{{ ajax_block(partials, updates_url, 'upcoming') }}
{{ ajax_block(partials, updates_url, 'upcoming') }}
<h2 class="font-body-xl margin-top-0">{{ current_service.name }} Dashboard</h2>
<h2 class="font-body-2xl line-height-sans-2 margin-top-0">{{ current_service.name }} Dashboard</h2>
{{ ajax_block(partials, updates_url, 'inbox') }}
{{ ajax_block(partials, updates_url, 'inbox') }}
<div id="totalMessageChartContainer" data-sms-sent="{{ sms_sent }}" data-sms-allowance-remaining="{{ sms_allowance_remaining }}">
<h2 id="chartTitle">Total messages</h2>
<svg id="totalMessageChart"></svg>
<div id="message"></div>
</div>
<div id="totalMessageTable" class="margin-0"></div>
<div id="totalMessageChartContainer" data-sms-sent="{{ sms_sent }}" data-sms-allowance-remaining="{{ sms_allowance_remaining }}">
<h2 id="chartTitle">Total messages</h2>
<svg id="totalMessageChart"></svg>
<div id="message"></div>
</div>
<div id="totalMessageTable" class="margin-0"></div>
<h2 class="line-height-sans-2 margin-bottom-0 margin-top-4">Recent activity</h2>
<div id="activityChartContainer">
<form class="usa-form">
<label class="usa-label" for="options">Account</label>
<select class="usa-select margin-bottom-2" name="options" id="options">
<option value>- Select -</option>
<option value="service" selected>{{ current_service.name }}</option>
<option value="individual">{{ current_user.name }}</option>
</select>
</form>
<div id="activityChart">
<div class="chart-header">
<div class="chart-subtitle">{{ current_service.name }} - last 7 days</div>
<div class="chart-legend" aria-label="Legend"></div>
</div>
<div class="chart-container" id="weeklyChart"></div>
<table id="weeklyTable" class="usa-sr-only usa-table"></table>
</div>
</div>
<div id="aria-live-account" class="usa-sr-only" aria-live="polite"></div>
{% include 'views/dashboard/activity-table.html' %}
{% if current_user.has_permissions('manage_service') %}{% endif %}
{% if current_user.has_permissions('manage_service') %}{% endif %}
<div class="table-container">
<div id="table1" class="table-overflow-x-auto hidden">
<h2 class="margin-top-4 margin-bottom-1">My activity</h2>
<table class="usa-table job-table">
<thead class="table-field-headings">
<tr>
<th scope="col" class="table-field-heading-first" id="jobId"><span>Job ID#</span></th>
<th data-sortable scope="col" class="table-field-heading"><span>Template</span></th>
<th data-sortable scope="col" class="table-field-heading"><span>Job status</span></th>
<th data-sortable scope="col" class="table-field-heading"><span># of Recipients</span></th>
</tr>
</thead>
<tbody>
{% if jobs %}
{% for job in jobs[:5] %}
{% if job.created_by.name == current_user.name %}
{% set notification = job.notifications[0] %}
<tr id="{{ job.job_id }}">
<td class="table-field jobid" scope="row" role="rowheader">
<a class="usa-link" href="{{ job.view_job_link }}">
{{ job.job_id[:8] if job.job_id else 'Manually entered number' }}
</a>
</td>
<td class="table-field template">{{ job.template_name }}</td>
<td class="table-field time-sent">Sent on
{{ (job.processing_finished if job.processing_finished else job.processing_started
if job.processing_started else job.created_at)|format_datetime_table }}
</td>
<td class="table-field count-of-recipients">{{ job.notification_count }}</td>
</tr>
{% endif %}
{% endfor %}
{% else %}
<tr class="table-row">
<td class="table-empty-message" colspan="10">No batched job messages found &thinsp;(messages are kept for {{ service_data_retention_days }} days).</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
<div id="table2" class="table-overflow-x-auto visible">
<h2 class="margin-top-4 margin-bottom-1">Service activity</h2>
<table class="usa-table job-table">
<thead class="table-field-headings">
<tr>
<th scope="col" role="columnheader" class="table-field-heading-first" id="jobId"><span>Job ID#</span></th>
<th data-sortable scope="col" role="columnheader" class="table-field-heading"><span>Template</span></th>
<th data-sortable scope="col" role="columnheader" class="table-field-heading"><span>Job status</span></th>
<th data-sortable scope="col" role="columnheader" class="table-field-heading"><span>Sender</span></th>
<th data-sortable scope="col" role="columnheader" class="table-field-heading"><span># of Recipients</span></th>
</tr>
</thead>
<tbody>
{% if jobs %}
{% for job in jobs[:5] %}
{% set notification = job.notifications[0] %}
<tr id="{{ job.job_id }}">
<td class="table-field jobid" scope="row" role="rowheader">
<a class="usa-link" href="{{ job.view_job_link }}">
{{ job.job_id[:8] if job.job_id else 'Manually entered number' }}
</a>
</td>
<td class="table-field template">{{ job.template_name }}</td>
<td class="table-field time-sent">Sent on
{{ (job.processing_finished if job.processing_finished else job.processing_started
if job.processing_started else job.created_at)|format_datetime_table }}
</td>
<td class="table-field sender">{{ job.created_by.name }}</td>
<td class="table-field count-of-recipients">{{ job.notification_count }}</td>
</tr>
{% endfor %}
{% else %}
<tr class="table-row">
<td class="table-empty-message" colspan="10">No batched job messages found &thinsp;(messages are kept for {{ service_data_retention_days }} days).</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
</div>
{{ ajax_block(partials, updates_url, 'template-statistics') }}
</div>
{{ ajax_block(partials, updates_url, 'template-statistics') }}
</div>
{% endblock %}

View File

@@ -1,4 +1,6 @@
<h2 class="font-body-lg margin-top-0 margin-bottom-1">Get started</h2>
<a class="usa-button margin-bottom-5" href="{{ url_for('.choose_template', service_id=current_service.id) }}">
Create your first template
</a>
<div class="get-started">
<h2 class="font-body-lg margin-top-0 margin-bottom-2">Get started</h2>
<a class="usa-button" href="{{ url_for('.choose_template', service_id=current_service.id) }}">
Create your first template
</a>
</div>

View File

@@ -11,10 +11,8 @@
<h1 class="font-body-2xl">Features</h1>
<p class="usa-body">If you work for the government, you can use Notify.gov to keep your users updated.</p>
<p class="usa-body">Notify makes it easy to create, customize, and send <a class="usa-link" href="{{ url_for('main.features_sms') }}">text messages</a>.</p>
<!-- <ul class="list list-bullet">
<li><a class="usa-link" href="{{ url_for('main.features_sms') }}">text messages</a></li>
</ul> -->
<p class="usa-body">Notify makes it easy to create, customize, and send text messages</a>.</p>
<p class="usa-body">You do not need any technical knowledge to use Notify.</p>
{% if not current_user.is_authenticated %}
<p class="usa-body"><a class="usa-link" href="{{ url_for('main.register') }}">Create an account</a> for free and try it yourself.</p>
@@ -30,7 +28,7 @@
<h2 class="heading-medium" id="personalised-messages">Personalized content</h2>
<p class="usa-body">Notify makes it easy to send personalized messages from a single template.</p>
<p class="usa-body">See <a class="usa-link" href="{{ url_for('.guidance_index', _anchor='personalized-content') }}">how to personalize your content</a>.</p>
<p class="usa-body">See <a class="usa-link" href="{{ url_for('.how_to', _anchor='personalized-content') }}">how to personalize your content</a>.</p>
<h2 class="heading-medium" id="bulk-sending">Bulk sending</h2>
<p class="usa-body">To send a batch of messages at once, upload a list of contact details to Notify. You can also schedule the date and time you want them to be sent.</p>

View File

@@ -1,244 +0,0 @@
{% extends "base.html" %}
{% from "components/table.html" import mapping_table, row, text_field, edit_field, field with context %}
{% from "components/sub-navigation.html" import sub_navigation %}
{% from "components/service-link.html" import service_link %}
{% block per_page_title %}
Guidance
{% endblock %}
{% block content_column_content %}
<h1 class="font-body-2xl margin-bottom-3">Guidance</h1>
<p>Notify allows you easily to create templates for messages for your recipients. You can customize messages to encourage
your recipient to manage their benefits and increase follow through.</p>
<p>Below we explain how to:</p>
<ul class="list list-bullet">
<li><a class="usa-link" href="#format-content">Format your content</a></li>
<li><a class="usa-link" href="#add-links">Add links</a></li>
<li><a class="usa-link" href="#personalize-content">Personalize your content</a></li>
<li><a class="usa-link" href="#conditional-content">Add conditional content</a></li>
<li><a class="usa-link" href="#indentify-program">Identify your program</a></li>
<li><a class="usa-link" href="#prepare-data">Prepare your data</a></li>
<li><a class="usa-link" href="#prevent-fraud">Prevent fraud</a></li>
</ul>
{# Format content #}
<h2 class="padding-top-1" id="format-content">Format your content</h2>
<p>Effective texts will help your message recipients take the steps needed to secure and keep the benefits and services
they depend on. To craft an effective text:</p>
<ul class="list list-bullet">
<li>Choose your messages thoughtfully. Text messages are best to remind/nudge someone to take a specific action or
communicate information at a particular time rather than pushing out broad or overly general information.</li>
<li>Clearly state the issue and expected response. Tell your recipient what you expect from them.</li>
<li>Say only one important thing per message.</li>
<li>Frame the message to encourage action and explain the consequences of not completing the desired action.</li>
</ul>
<h3>To create and format your message</h3>
<ol class="list">
<li>All messages start from a template</li>
<li>Click "<a href={{ url_for('.choose_template', service_id=current_service.id) }}>Send Messages</a>". You'll see existing templates.</li>
<li>Add a new template or choose an existing template and select Edit.</li>
</ol>
{# Add links #}
<h2 class="padding-top-1" id="add-links">Add links</h2>
<p>When composing a text message, links to websites or online applications can help your recipient respond quickly.</p>
<ul class="list list-bullet">
<li>Write URLs in full and Notify will convert them into links for you. Note that you cannot hyperlink text in Notify
messages.</li>
<li>For link click tracking, you can consider adding campaign parameters to URLs.</li>
<li>All links should point to a government domain.</li>
<li>Link directly to where your recipient needs to take action, not to more information.</li>
</ul>
<h3>About link-shortening services</h3>
<p>We do not recommend using a third-party link-shortening service because:</p>
<ul class="list list-bullet">
<li>Your recipient cannot see where the link will take them, which could make them suspect the link is spam/scam.</li>
<li>Your link might stop working if theres a service outage.</li>
<li>You can no longer control where the redirect goes.</li>
</ul>
{# Personalize content #}
<h2 class="padding-top-1" id="personalize-content">Personalize your content</h2>
<p>Personalizing your content can increase response rates and help the recipient know the text is legitimate.</p>
<ul class="list list-bullet">
<li>Including a person's first name increases response rates.</li>
<li>Specific details such as time and location of an appointment or where suspected fraud use occurred encourages action.</li>
</ul>
<h3>To personalize your content</h3>
<ol class="list">
<li>Add a placeholder to your content by placing two brackets around the personalized elements.</li>
<li>You can manually enter the personalized content or you can upload a spreadsheet with the details and let Notify do the
work for you. See <a href="#prepare-data">data preparation</a>.</li>
</ol>
<h4>Example</h4>
<p>To personalize with the recipient's first name and include a reference number:</p>
<p class="padding-2 bg-base-lightest">State WIC: Hello ((first name)), your reference is ((ref number)). Please provide this number when you call 555-123-1234 to make an appointment.</p>
<p>Note that variations in the length of personalized content can impact the length of specific messages, and may affect
the number of parts used.</p>
{# Add conditional content #}
<h2 class="padding-top-1" id="conditional-content">Add conditional content</h2>
<p>Conditional (or optional) content appears only when a recipient meets certain criteria. This feature allows you to make
all or part of the message contingent upon specific criteria associated with the recipient.</p>
<h3>To add conditional content</h3>
<ol class="list">
<li>Use two brackets and ?? to define the conditional content.</li>
<li>You can manually enter the conditional content or you can upload a spreadsheet with the personal details and let Notify
do the work for you. See <a href="#prepare-data">data preparation</a>.</li>
</ol>
<h4>Examples</h4>
<ol class="list">
<li>If you only want to show something to people who are under 18:
</br>
<p class="padding-2 bg-base-lightest">State SNAP: Renewal applications are due by March 15. ((under18??Please get your application signed by a parent or
guardian.))</p>
</li>
<li>
If you want to make people who are homebound aware of the option of virtual visits (but not other message recipients):
</br>
<p class="padding-2 bg-base-lightest">State Medicaid: Please call 555-123-1234 to schedule an appointment. ((homebound??Virtual visits are available.))</p>
</li>
<li>
If you want to send a messages in different languages to different recipients:
</br>
<p class="padding-2 bg-base-lightest">((English??Weve identified unauthorized use on your EBT account. Call the phone number on the back of your card to
cancel or go to your local CSO for immediate replacement.))((Spanish??Hemos identificado un uso no autorizado en su
cuenta EBT. Llame al número de teléfono que aparece en el reverso de su tarjeta para cancelarla o diríjase a su CSO
local para que se la sustituyan inmediatamente.))</p>
</li>
</ol>
{# Identify your program #}
<h2 class="padding-top-1" id="indentify-program">Identify your program</h2>
<p>You can help your recipients identify your texts as legitimate by customizing your messages to clearly state who they
are from. Consider using the program or benefit name that is most familiar to your recipients.</p>
<h3>To customize your program name</h3>
<p>To change the text message sender from the default service name:</p>
<ol class="list">
<li>Go to the <a href="{{ url_for('main.service_settings', service_id=current_service.id) }}">Settings page</a></li>
<li>Select “Start text messages with service name.”</li>
<li>Change the service name to a familiar program or benefit.</li>
</ol>
{# Prepare your data #}
<h2 class="padding-top-1" id="prepare-data">Prepare your data</h2>
<p>The easiest and most efficient way to personalize your content is by uploading a spreadsheet. Notify can accommodate
many file formats and structures.</p>
<h3>File format</h3>
<p>Notify can accept files in the following formats: CSV, TSV, ODS, and Microsoft Excel.</p>
<h3>File structure</h3>
<ul class="list">
<li>The phone number must be in the first column (Column A) and must be labeled <strong>Phone number</strong>.</li>
<li>Each column must have a unique name.</li>
<li>If you are using Excel, you must either disable the”auto-date/time format” for time and date columns or convert the file
to a CSV prior to loading. (If you do not, Excel will display date/time data in a confusing format.)</li>
</ul>
<h3>Formatting personalized content</h3>
<p>If you are sending a message with personalized content, such as the first name of the recipient or the appointment time
and location, the names of the column headings have to match the indicator included in the message template.</p>
<p>For example, if the personalized content is the first name of the recipient, and we are using the spreadsheet below, the
indicator in the message needs to be ((First name)), not ((firstname)) or ((name)).</p>
<h3>Formatting conditional content</h3>
<p>If you are sending messages with conditional content, such as content based on the recipients preferred language or
location, the flag to receive the content needs to be captured in its own column with a Yes or No (Y/N) flag.</p>
<h3>Example</h3>
<div class="table-overflow-x-auto">
<table class="usa-table">
<caption class="usa-sr-only">
Example
</caption>
<thead>
<tr>
<th scope="col">Phone number</th>
<th scope="col">First name</th>
<th scope="col">Last name</th>
<th scope="col">Spanish</th>
<th scope="col">English</th>
<th scope="col">Date</th>
<th scope="col">Time</th>
<th scope="col">Location</th>
</tr>
</thead>
<tbody>
<tr>
<td>123-456-7890</td>
<td>Lulu</td>
<td>Praether</td>
<td>N</td>
<td>Y</td>
<td>November 2, 2023</td>
<td>3:25</td>
<td>123 Ford Rd.</td>
</tr>
<tr>
<td>234-567-8901</td>
<td>Sela</td>
<td>Appel</td>
<td>Y</td>
<td>N</td>
<td>November 2, 2023</td>
<td>4:00</td>
<td>123 Ford Rd.</td>
</tr>
<tr>
<td>123-456-7890</td>
<td>Dexter</td>
<td>Moseley</td>
<td>N</td>
<td>Y</td>
<td>November 2, 2023</td>
<td>2:00</td>
<td>123 Ford Rd.</td>
</tr>
</tbody>
</table>
</div>
{# Preventing fraud #}
<h2 class="padding-top-1" id="prevent-fraud">Preventing fraud</h2>
<p>Texting fraud is ever prevalent and while we cant eliminate the risk, we can reduce the chances that recipients will
fall victim to fraud.</p>
<ol class="list">
<li>Never send unnecessary or protected private information.</li>
<li>Remind your recipients that text messaging is not a secure means of communication and they should not send you private
information via text.</li>
<li>Only include links to websites and online applications that are secure.</li>
<li>Send an introductory text letting recipients know you will be texting them and to save the number in their phone.</li>
<li>Include an auto-response with the name of your organization and a contact phone number.</li>
</ol>
<h3>Examples</h3>
<ol class="list">
<li>Introductory text:
</br>
<p class="padding-2 bg-base-lightest">State Transit Dept: We're piloting a new way to get important reminders to our staff. Save this number to your phone,
you'll receive updates from us here.</p>
</li>
<li>Auto-response text:
</br>
<p class="padding-2 bg-base-lightest">State Agency: This number is unmonitored. To contact us, call us at 555-123-1234. We will never ask for personal details
in a text. If you have questions about how to protect your privacy, see statename.gov/privacy.</p>
</li>
</ol>
{% endblock %}

View File

@@ -0,0 +1,115 @@
{% extends "base.html" %}
{% import "components/nav_breadcrumb.html" as breadcrumbs %}
{% set page_title = "Measuring performance with benchmarking" %}
{% block per_page_title %}
{{page_title}}
{% endblock %}
{% block content_column_content %}
{{ breadcrumbs.breadcrumb(page_title, "Best practices", "main.best_practices") }}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p class="font-sans-lg text-base">Learn how effective your texting program can be.</p>
<p>
Several factors determine a messaging campaigns success, but the performance of previous projects can help set
expectations. Get to know what other government texting initiatives have done as a way to benchmark your own
performance.
</p>
<h2>What other texting studies have found</h2>
<p>
When the <a class="use-link usa-link--external"
href="https://www.cbpp.org/research/food-assistance/targeted-text-message-outreach-can-increase-wic-enrollment-pilots-show"
target="_blank">Center on Budget and Policy Priorities</a> studied WIC, they found key learnings about the
quantity of messages delivered, how people engage with messages, and how they take action.
</p>
<h3>Message delivery</h3>
<p class="text-light">Benchmark: <span class="text-bold">80%</span> of texts are
successfully delivered
</p>
<ul>
<li>
<p>
You may discover that some numbers are temporarily or permanently unavailable due to service being
discontinued,
numbers changing, or being a landline.
</p>
</li>
</ul>
<h3>Engagement</h3>
<p class="text-light">Benchmark: Engagement rates with texts ranged from <span
class="text-bold">17%</span>
to <span class="text-bold">26%</span></p>
<ul>
<li>
<p>
The highest rate of engagement with a text comes within hours of sending. Engagement rates include any kind
of
action taken due to a text, including replying “STOP” to prevent future texts.
</p>
</li>
</ul>
<h3>Appointment requests</h3>
<p class="text-light">Benchmark: Requesting appointments after receiving texts ranged
from <span class="text-bold">4%</span> to <span class="text-bold">9%</span></p>
<ul>
<li>
<p>
Requesting appointments is a specific type of engagement. Provide a phone number or link to an online
appointment
request form.
</p>
</li>
</ul>
<p>
The <a class="use-link usa-link--external" href="https://codeforamerica.org/resources/texting-playbook/"
target="_blank">Code for Americas Texting
Playbook</a>
reported specific learnings around appointment reminders, completing
document submission, and maintenance reminders.
</p>
<h3>Appointment reminders</h3>
<p class="text-light">Benchmark: Clients were <span class="text-bold">79%</span> more
likely to keep their appointment after receiving a text reminder.</p>
<ul>
<li>
<p>You will likely see more completed appointments.</p>
</li>
</ul>
<p class="text-light">Benchmark: Clients were <span class="text-bold">55%</span> more
likely to complete an interview after receiving an interview reminder</p>
<ul>
<li>
<p>You will likely see more completed interviews.</p>
</li>
</ul>
<h3>Document submission</h3>
<p class="text-light">
Benchmark: Clients were <span class="text-bold">6%</span> more likely to complete document submission after
receiving a customized list of required documents via text
</p>
<ul>
<li>
<p>To encourage response, provide a custom list of the needed documents and information about how to submit
them.
</p>
</li>
</ul>
<h3 class="font-body-xl">Reminders</h3>
<p class="text-light">Benchmark: Text reminders improved case maintenance rates by <span
class="text-bold">21%</span></p>
<ul>
<li>
<p>You may see less turnover in your case rates.</p>
</li>
</ul>
</section>
{% endblock %}

View File

@@ -0,0 +1,65 @@
{% extends "base.html" %}
{% set page_title = "Best practices" %}
{% block per_page_title %}
{{page_title}}
{% endblock %}
{% block content_column_content %}
<section class="usa-prose">
<h1>Best practices</h1>
<p class="font-sans-lg text-base">For texting the public</p>
<p>Effectively reaching your audience and supporting your programs goals starts with strategically planning out what
text messages can help you achieve and how to approach a thoughtful rollout.
</p>
<p>This set of best practices will help you get an effective texting initiative up and running.</p>
<h2 class="padding-bottom-4">
Key elements of a texting campaign
</h2>
{% set card_contents = [
{
"svg_src": "goal",
"card_heading": "Establish clear goals",
"p_text": "Start with a singular purpose. Make explicit what you want to achieve.",
"link": "/using-notify/best-practices/clear-goals"
},
{
"svg_src": "compliant",
"card_heading": "Follow rules & regulations",
"p_text": "Understand what is required when texting the public.",
"link": "/using-notify/best-practices/rules-and-regulations"
},
{
"svg_src": "trust",
"card_heading": "Establish trust",
"p_text": "Help your audience anticipate and welcome your texts.",
"link": "/using-notify/best-practices/establish-trust"
},
{
"svg_src": "runner",
"card_heading": "Write texts that provoke action",
"p_text": "Help your audience know what to do with the information you send.",
"link": "/using-notify/best-practices/write-for-action"
},
{
"svg_src": "language",
"card_heading": "Send texts in multiple languages",
"p_text": "What to know as you plan translated texts.",
"link": "/using-notify/best-practices/multiple-languages"
},
{
"svg_src": "chart",
"card_heading": "Measure performance with benchmarking",
"p_text": "Learn how effective your texting program can be.",
"link": "/using-notify/best-practices/benchmark-performance"
}
] %}
{% with card_contents=card_contents %}{% include "components/guides/cards.html" %}{%
endwith %}
</section>
{% endblock %}

View File

@@ -0,0 +1,203 @@
{% extends "base.html" %}
{% import "components/nav_breadcrumb.html" as breadcrumbs %}
{% set page_title = "Establish clear goals" %}
{% block per_page_title %}
{{page_title}}
{% endblock %}
{% block content_column_content %}
{{ breadcrumbs.breadcrumb(page_title, "Best practices", "main.best_practices") }}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p class="font-sans-lg text-base">Start with a singular purpose. Make explicit what you want to achieve.</p>
<div class="grid-row grid-gap-3">
<div class="tablet:grid-col">
<p>Text messaging should be one part of how you communicate with the people you serve, and it is best used to
provoke
action or influence behavior. Therefore, when starting to plan your texting campaign, its important to start
with
the end in mind.
</p>
<div class="usa-summary-box maxw-tablet" role="region" aria-labelledby="summary-box-establish-clear-goals">
<div class="usa-summary-box__body">
<p class="usa-summary-box__heading" id="summary-box-establish-clear-goals">
To establish clear goals, start by answering the following questions:
</p>
<div class="usa-summary-box__text">
<ul class="usa-list">
<li><i>Who</i> do you want to text?</li>
<li><i>At what moments</i> do you want to text them?</li>
<li><i>Why</i> do you want to text them?</li>
<li>What do you want them to <i>do</i>?</li>
</ul>
</div>
</div>
</div>
</div>
<div class="tablet:grid-col width-full padding-top-3">
<div class="grid-container">
<div class="usa-card__container border-0 width-full overflow-hidden maxh-mobile-lg">
<img class="width-full" src="{{ asset_url('images/phone_grey.svg') }}" role="img" alt="Phone" />
<div class="position-absolute flex text-center padding-5 padding-top-15">
<p class="sms-message-wrapper text-left">Dept. of Human Services: We believe your EBT card may have been
used by
someone else. Please call the number on the back of your card (888-123-5555) to cancel and get a new
one.
If
you
need a new card immediately, please visit your local office.
</p>
</div>
</div>
</div>
</div>
</div>
<hr>
<h2>When should you send a text?</h2>
<div class="grid-row grid-gap-3">
<div class="tablet:grid-col">
<div class="do-dont">
<div class="do-dont__do">
<h3 class="do-dont__heading"><a id="what-to-do" class="usa-anchor"></a>
<svg class="usa-icon" aria-hidden="true" focusable="false" role="img">
<use xlink:href="{{ url_for('static', filename='img/sprite.svg') }}#check_circle"></use>
</svg>
What to do
</h3>
<div class="do-dont__content">
<p><b>Use texting to</b> share timely
information, provide critical status updates, or remind someone to do something.</p>
<p class="margin-bottom-2">Examples:</p>
{% set list_item_dos = [
{
"list_content": "Your application is due on…",
},
{
"list_content": "We need more information from you to process your application for…",
},
{
"list_content": "We will be calling you about…at…",
},
{
"list_content": "We will be calling you about…at…",
},
] %}
<ul>
{% for item in list_item_dos %}
<li>
{{item.list_content}}
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
</div>
<div class="tablet:grid-col">
<div class="do-dont">
<div class="do-dont__dont">
<h3 class="do-dont__heading"><a id="what-not-to-do" class="usa-anchor"></a>
<svg class="usa-icon" aria-hidden="true" focusable="false" role="img">
<use xlink:href="{{ url_for('static', filename='img/sprite.svg') }}#cancel"></use>
</svg> What not to do
</h3>
<div class="do-dont__content">
<p>Texting is <b>not great for</b> long,
detailed instructions or frequent reminders that may be ignored.
</p>
<p class="margin-bottom-2">Examples:</p>
{% set list_item_donts = [
{
"list_content": "Your rights and responsibilities",
},
{
"list_content": "How to complete your application",
},
{
"list_content": "Weekly reminder not to share your account information",
},
] %}
<ul>
{% for item in list_item_donts %}
<li>
{{item.list_content}}
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
</div>
</div>
<p>Your program may already be communicating with your audience through methods like mailed notices and phone calls.
Think of text messages as complementary to your existing communications. Review how well you are currently reaching
your audience. Are there methods or gaps that could be supplemented with a text message?
</p>
<p>
The Department of Veterans Affairs provides a <a class="use-link usa-link--external"
href="https://github.com/department-of-veterans-affairs/va.gov-team/blob/master/products/va-notify/notification-guide.md#vanotify-notification-guide"
target="_blank">helpful flow-chart</a> that can help you decide if a text message is needed
for the communication problem you are trying to solve.
</p>
<h2>Use a hypothesis framework to plan your campaign</h2>
<p>
Think of your texting campaign as a scientific experiment, and try to articulate what you hope to improve as a
result of implementing text messaging at your agency. For example:
</p>
<div class="usa-summary-box maxw-tablet" role="region" aria-labelledby="summary-box-establish-clear-goals">
<div class="usa-summary-box__body">
<div class="usa-summary-box__text">
<p class="margin-top-0 font-body-lg">
We believe that texting <i>[specific group of people]</i> when <i>[this happens or on this
cadence]</i> to inform/alert them about <i>[subject]</i> will result in <i>[desired action]</i>.
</p>
</div>
</div>
</div>
<p>
Review your drafted hypothesis with your team to make sure everyone is aligned on your desired goals. A clear and
concise hypothesis can help you decide how to <a href="../best-practices/write-for-action">write text message
content
that provokes action</a>.
</p>
<h2>Begin with a small test</h2>
<p>
To help you decide how much to invest in text messaging over time, we highly recommend starting small and testing
your message campaigns to refine based on feedback and evidence.
</p>
<p>
Starting small has less risk and more flexibility. It can help you gather data and decide <i>if and how</i> to send
more text messages. For example, start by sending one message to a smaller sample of your audience and track their
resulting behavior.
</p>
<p>
At a minimum, make sure to get feedback on your message content from staff, community-based organizations, and,
ideally, from people who receive the texts themselves to ensure your messages are clear and actionable.
</p>
<h2>Measure performance</h2>
<p>Building and operationalizing a texting initiative requires time and effort, and you want to be able to demonstrate
the results of that effort.</p>
<div class="usa-summary-box maxw-tablet" role="region" aria-labelledby="summary-box-establish-clear-goals">
<div class="usa-summary-box__body">
<div class="usa-summary-box__text">
<p class="margin-top-0">
To understand if your texting program is successful, ask:
</p>
<ul class="usa-list">
<li>What do you want to be different for your program or your desired audience after a text message is sent,
as compared to your current state?</li>
<li>How will you know if text recipients take the desired action?</li>
<li>Do you have access to existing data in your system that you could use to determine whether texting is
giving you the results you want?</li>
</ul>
</div>
</div>
</div>
</section>
{% endblock %}

View File

@@ -0,0 +1,196 @@
{% extends "base.html" %}
{% import "components/nav_breadcrumb.html" as breadcrumbs %}
{% from "components/guides/circle_number.html" import circle_number %}
{% set page_title = "Establish trust" %}
{% block per_page_title %}
{{page_title}}
{% endblock %}
{% block content_column_content %}
{{ breadcrumbs.breadcrumb(page_title, "Best practices", "main.best_practices") }}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p class="font-sans-lg text-base">Help your audience anticipate and welcome your texts.</p>
<p>
People are wary of texts theyre not expecting to receive. Before you send your first text, consider how you will
gain trust with your audience and address any concerns of spam. Seize specific moments to reinforce what your
audience should expect from your messages.
</p>
<h2 id="get-the-word-out">Get the word out</h2>
<p>Before you launch, let your audience know you are adding texting as a communication method. People are more likely
to trust your text once they get it if they know that your program is sending texts.</p>
<p>How you currently communicate with your audience will determine the best approaches to announce your new
initiative. Harness channels youre already using like social media, public websites, mailing inserts, or fliers at
key service locations as well as partnering with community organizations to get the word out about your new texting
program.</p>
<h3>An example of key messages in direct mail</h3>
<figure>
<img src="{{asset_url('images/snap-renewal.jpg')}}" alt="snap-renewal" width="100%">
<figcaption>A paper mailer sent out by the State of Connecticut, in partnership with Code for America, to get the
word out about their new SNAP texting initiative. Flier displays an image of an introduction text and includes key
messages to reinforce legitimacy.</figcaption>
</figure>
<h3>Prime your audiences to trust you</h3>
<ul class="usa-card-group flex-1 flex-wrap padding-top-2">
<li class="flex-1 width-full height-full padding-bottom-2">
<div class="usa-card__container border-0">
<p>To reinforce legitimacy, include these key messages in your outreach:</p>
<ol class="guides-list">
<li><b>Introduce yourself</b> Give people time to get to know your texting communications before you need
direct action from them</li>
<li><b>Phone number</b> Note the sending phone number your texts will come from</li>
<li><b>Text types</b> Be clear on the types of texts you intend to send, how often, and why they matter</li>
<li><b>Privacy policy</b> For example, state that you will not collect personal information, including the
types of information you will never ask for</li>
<li><b>Places to verify</b> Include a phone number, website, or human where people can verify that the texts
are coming from you</li>
<li><b>Opt out</b> Provide opt-out instructions and a disclaimer for the potential cost of receiving the
text
</li>
</ol>
</div>
</li>
<li class="usa-card flex-1 usa-card--media-right width-full padding-top-3">
<div class="usa-card__container border-0 width-full overflow-hidden height-phone-lg">
<img class="width-full" src="{{ asset_url('images/phone_grey.svg') }}" role="img" alt="Phone" />
<div class="position-absolute flex text-center padding-5 padding-top-15">
<p class="sms-message-wrapper text-left">Dept. of Social Services: Welcome to text updates from the
{{circle_number(1)}}<b>Department of Social Services.</b> {{ circle_number(2) }}<b>Well always text
you from
this number,</b> save us to your contact list. Our goal is to {{ circle_number(3) }} <b>keep you up to
date on
your account status.</b> {{ circle_number(4) }} <b>We will never ask for personal details in a text.</b>
{{ circle_number(5) }} If you have questions about how we protect your privacy, see
state.gov/privacy.{{circle_number(6) }}<b>Reply STOP to stop.</b>
</p>
</div>
</div>
</li>
</ul>
<hr>
<h2 id="as-people-receive-texts">As people receive texts</h2>
<p>When a person has questions or needs assistance, reaching out for support may be natural for them. Give direction
in your texts so your audience understands what to do with the information you provide. Remember, its important to
repeat consistent and standardized language across texts and programs.</p>
<h3>Be trustworthy</h3>
<ul class="usa-card-group flex-1 flex-wrap padding-top-2">
<li class="flex-1 width-full height-full padding-bottom-2">
<div class="usa-card__container border-0">
<ol start="7" class="guides-list set-two">
<li>Identify yourself in the text message. Use a consistent and familiar <b>program name</b> to precede each
text you send.</li>
<li>Personalize with <b>first name</b>. Through A/B testing, Code for America saw an increase in
follow-through by 25% if someones first name was included.</li>
<li>Use <b>full and direct .gov website URLs</b>. Avoid link shorteners, as they obscure your links and
potentially make it easier for a malicious actor to spoof your text.</li>
<li>If providing a phone number, use a familiar phone number and <b>provide information on how to verify</b>
its legitimacy.</li>
</ol>
</div>
</li>
<li class="usa-card flex-1 usa-card--media-right width-full padding-top-1">
<div class="usa-card__container border-0 width-full height-mobile overflow-hidden">
<img class="width-full" src="{{ asset_url('images/phone_grey.svg') }}" role="img" alt="Phone" />
<div class="position-absolute flex text-center padding-5 padding-top-10">
<p class="sms-message-wrapper text-left">
{{circle_number(7) }}<b>Dept. of Social Services:</b> Hi {{circle_number(8) }}<b>Julie,</b> Your Medicaid
renewal is closing December 31, 2023. You can renew online at {{circle_number(9) }}<a
class="use-link usa-link--external" href="https://www.application.yourstate.gov" target="_blank"
rel="application.yourstate.gov">https://www.application.yourstate.gov</a> or {{circle_number(10) }}
<b>call the number on the back</b> of your Medicaid card.
</p>
</div>
</div>
</li>
</ul>
<h3>Provide helpful auto-responses</h3>
<ul class="usa-card-group flex-1 flex-wrap padding-top-2">
<li class="flex-1 width-full height-full padding-bottom-2">
<div class="usa-card__container border-0">
<p>If you're sending one-way notifications, phone carriers allow a single auto-response message that will be
generated if a recipient tries to text a response to your message. Use the auto-response to reaffirm your key
messages around legitimacy and communicate to recipients that texts are coming from an automated system.</p>
<ol class="guides-list set-three">
<li>Provide <b>a way to contact a human</b> in any auto-response text</li>
<li>Provide <b>information on how to opt out</b> and opt back in</li>
</ol>
</div>
</li>
<li class="usa-card flex-1 usa-card--media-right width-full padding-top-3">
<div class="usa-card__container border-0 width-full overflow-hidden guides">
<img class="width-full" src="{{ asset_url('images/phone_grey.svg') }}" role="img" alt="Phone" />
<div class="position-absolute flex text-center padding-5 padding-top-15">
<p class="sms-message-wrapper text-left">
Dept. of Social Services: This number is unmonitored. To {{circle_number(11) }} <b>contact us, call
888-123-4567</b>. We will never ask for personal details in a text. If you have questions about how to
protect your privacy, see state.gov/privacy {{circle_number(12) }} <b>Reply “STOP”</b> to this phone number
to opt out of receiving texts, and “START” to opt back in.
</p>
</div>
</div>
</li>
</ul>
<h2>Be prepared for questions</h2>
<p>
Your texting program will only be perceived as legitimate if you get the word out in many different ways. It's also
important that agency employees who support text recipients (for example, the call center) are familiar with the
texting program. They can accurately respond to recipient questions about them, so make sure youre priming your
delivery staff, especially those who interact directly with your intended audience.
</p>
<h3 class="padding-bottom-2">Harness trusted communication channels</h3>
{% set card_contents = [
{
"image_src": asset_url('images/website.svg'),
"card_heading": "Websites",
"alt_text": "Graphic representing a website browser",
"p_text": "Post banner alerts about texting on your agency website and link to a press release for more information.
Publish a public texting privacy policy.",
},
{
"image_src": asset_url('images/community-org.svg'),
"card_heading": "Community organizations",
"alt_text": "Illustration of community organizations spreading awareness",
"p_text": "Alert trusted community-based organizations that texts are coming and what they look like. Equip them with
fliers, posters, and talking points to spread the word.",
},
{
"image_src": asset_url('images/call-center.svg'),
"card_heading": "IVR / Call Centers",
"alt_text": "Illustration of a call center promoting texting initiative",
"p_text": "Consider adding hold message announcements about your texting initiative to further get the word out.",
},
] %}
{% with card_contents=card_contents %}{% include "components/guides/cards.html" %}{%
endwith %}
<h3 class="padding-bottom-2">Prepare your team</h3>
{% set card_contents = [
{
"image_src": asset_url('images/grouping.svg'),
"card_heading": "Staff",
"alt_text": "Illustration of staff group briefing",
"p_text": "Give all staff a heads-up about texts before and when they are sent. Share talking points on what texts
youre sending, when youll start to send them, the phone number they are coming from, and where staff can escalate
any issues.",
},
{
"image_src": asset_url('images/project-management.svg'),
"card_heading": "Case management systems",
"alt_text": "Graphic representing project management",
"p_text": "When it makes sense, include information about texts being sent to specific clients on individual splash
pages or within case management notes.",
},
] %}
{% with card_contents=card_contents %}{% include "components/guides/cards.html" %}{%
endwith %}
</section>
{% endblock %}

View File

@@ -0,0 +1,32 @@
{% extends "base.html" %}
{% import "components/nav_breadcrumb.html" as breadcrumbs %}
{% set page_title = "Text in multiple languages" %}
{% block per_page_title %}
{{page_title}}
{% endblock %}
{% block content_column_content %}
{{ breadcrumbs.breadcrumb(page_title, "Best practices", "main.best_practices") }}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p class="font-sans-lg text-base"> What to know as you plan translated texts.</p>
<p>
Sending messages in recipients preferred language demonstrates respect, makes it more likely that recipients will
understand and take action on the message, and may be required by your agency or program.
</p>
<p>
To send translated messages using Notify.gov you will need two things: a record of your recipients preferred
language and translation/s of the message template. Notify.gov does not provide translation services.
</p>
<p>
As with messages in English, we strongly recommend user testing the translations with people who speak the language
to ensure the messages are understandable.
</p>
</section>
{% endblock %}

View File

@@ -0,0 +1,128 @@
{% extends "base.html" %}
{% import "components/nav_breadcrumb.html" as breadcrumbs %}
{% set page_title = "Rules and regulations" %}
{% block per_page_title %}
{{page_title}}
{% endblock %}
{% block content_column_content %}
{{ breadcrumbs.breadcrumb(page_title, "Best practices", "main.best_practices") }}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p class="font-sans-lg text-base">Understand what is required when texting the public.</p>
<h2>What to know about consent and opting out</h2>
<p>
Providing consent and opting out are key ways for text recipients to express their text communication preferences.
Discuss your obligation to obtain consent with your legal counsel.
</p>
<p>
If you do need expressed consent, consider including a pre-checked plain language opt-in (i.e. “Its OK to text
me.”) on
digital forms. Be sure to ask for an up-to-date phone number and include a question about the recipients preferred
language for text messages if you expect to <a href="../best-practices/multiple-languages">translate your text
messages</a> in
languages other than English.
</p>
{% set links = [
{
"p_text": 'The <a class="use-link usa-link--external" href="https://www.fcc.gov/sites/default/files/tcpa-rules.pdf"
target="_blank">Telephone Consumer
Protection Act (TCPA)</a> (47 USC § 227) is the federal law that impacts how organizations are allowed to
communicate
in bulk with the public via telephone (including text message or SMS).'
},
{
"p_text": 'The <a class="use-link usa-link--external"
href="https://www.fcc.gov/document/fcc-provides-best-practices-enable-critical-health-care-coverage-calls"
target="_blank">FCC has ruled</a> that <b>Federal</b> and <b>State</b> programs are exempt from the TCPA and can
send
text messages to the public without consent if conducting official business. Without explicit mention in the ruling,
local governments, phone carriers, or any texting intermediaries might require it.'
},
{
"url_link":
"pdf/tcpa_overview.pdf",
"url_text":"Download and share our overview of the TCPA with your legal counsel",
"is_downloadable": true,
"p_text": 'It provides a baseline
interpretation to aid your legal counsel in getting up to speed with what might be needed for your program or use
case.
For additional questions about the enforcement of the TCPA, you can watch <a class="use-link usa-link--external"
href="https://www.performance.gov/cx/life-experiences/facing-a-financial-shock/outputs/fcc-training/"
target="_blank">a recorded training on public
benefits texting</a> provided by the FCC.'
},
] %}
<h3>Complying with the Telephone Consumer Protection Act (TCPA)</h3>
<ul class="usa-collection">
{% for item in links %}
<li class="usa-collection__item">
<div class="usa-collection__body">
{% if item.url_text %}
<h4 class="usa-collection__heading">
<a class="usa-link {% if item.is_downloadable %}usa-link--downloadable{% else %}usa-link--external{% endif %}"
href="{% if item.is_downloadable %}{{ asset_url(item.url_link) }}{% else %}{{ item.url_link }}{% endif %}"
target="_blank">
{{ item.url_text }}
</a>
</h4>
{% endif %}
<p class="usa-collection__description">
{{item.p_text |safe}}
</p>
</div>
</li>
{% endfor %}
</ul>
<h3>Opting out</h3>
<p>
There is no policy requirement for senders to communicate opt-out options, but <a
href="../best-practices/establish-trust#as-people-receive-texts"> including instructions in introductory and/or
auto-response texts </a> on how to opt out and opt back in are effective ways to establish trust with your
audience.
</p>
<p>
In the US, no matter where texts are coming from, a recipient has the right to revoke consent at any time through
any
reasonable means. For example, a text recipient can always opt out of receiving text messages from a phone number by
responding “STOP”, “QUIT”, or <a class="usa-link usa-link--external"
href="https://docs.aws.amazon.com/pinpoint/latest/userguide/channels-sms-limitations-opt-out.html#settings-sms-self-opt-out-terms"
target="_blank">one of several other keywords</a>.
</p>
<p>
Any subsequent messages sent to that number will be blocked by the phone carrier and not delivered. We recommend
establishing an internal process to obtain and remove numbers that fail multiple times to avoid continuing to send
messages to them.
</p>
<h2>Honoring privacy</h2>
<h3>Phone numbers are personally identifiable information (PII)</h3>
<p>
When putting together the data spreadsheet (or CSV) file containing text message data, follow relevant security
processes for storing and transmitting the file that contains PII.
</p>
<h3>Dont text sensitive information</h3>
<p>
Sensitive information should be protected and secure. Social Security Numbers, drivers license numbers, personal
health information, and passwords are all sensitive PII that should not be shared via text message. Consult with
your privacy office to understand what information you can and cannot include in a text message. Different programs
and jurisdictions may have different rules and interpretations.
</p>
<h3>Assess risk</h3>
<p>
Consider the risks if someone who is not the intended recipient receives the text message. Establish an internal
process
to keep your phone number list up-to-date. The FCC offers a <a class="use-link usa-link--external"
href="https://www.fcc.gov/reassigned-numbers-database" target="_blank"
rel="Reassigned Numbers Database">Reassigned
Numbers Database</a> to identify phone numbers that may have been reassigned since your agency obtained them.
</p>
</section>
{% endblock %}

View File

@@ -0,0 +1,109 @@
{% extends "base.html" %}
{% import "components/nav_breadcrumb.html" as breadcrumbs %}
{% from "components/guides/circle_number.html" import circle_number %}
{% set page_title = "Write texts that provoke action" %}
{% block per_page_title %}
{{page_title}}
{% endblock %}
{% block content_column_content %}
{{ breadcrumbs.breadcrumb(page_title, "Best practices", "main.best_practices") }}
<section class="usa-prose">
<h1>{{page_title}}</h1>
<p class="font-sans-lg text-base"> Help your audience know what to do with the information you send.</p>
<p>
When writing a text, focus on the person who is going to receive the message and write it for them. Use plain
language and provide easy to understand next steps.
</p>
<div class="usa-summary-box maxw-tablet" role="region" aria-labelledby="summary-box-establish-clear-goals">
<div class="usa-summary-box__body">
<p class="usa-summary-box__heading" id="summary-box-establish-clear-goals">
When deciding what types of messages to draft for your campaign, think through the following questions:
</p>
<div class="usa-summary-box__text">
<ul class="usa-list">
<li>What do you want recipients to do when they receive the text?</li>
<li>What will happen if a recipient doesn't take the action you want them to take?</li>
<li>Will you send any follow-up texts depending on if the action was taken or not?</li>
</ul>
</div>
</div>
</div>
<h2>Be clear and concise</h2>
<ul>
<li>Use simple, everyday language. Keep the text short and clear. Stay under 300 characters.</li>
<li>
Say only one important thing per message. Focus on the most essential instructions and information. If there are
multiple actions you want someone to take, consider sending a series of well-timed messages.
</li>
<li>Use a neutral, direct, and professional tone. This works better than a friendly or overly casual tone.</li>
</ul>
<h2>Build conditions for action</h2>
<ul class="usa-card-group flex-1 flex-wrap padding-top-2 guides-flex-container">
<li class="flex-1 width-full height-full padding-bottom-2">
<div class="usa-card__container border-0">
<p>For example, getting a person to update their mailing address:</p>
<ol class="guides-list">
<li>Clearly state the information and the response you want the recipient to take.</li>
<li>Point directly to where the action can be completed, not to more information.</li>
<li>Make sure the action can be completed via mobile phone, like calling a person or going to a
mobile-friendly URL.
</li>
<li>
Include at least two options for a recipient to take action. Some recipients may be more comfortable talking
directly
to a person, while others may prefer a web-based experience.
</li>
<li>Consider clearly explaining any consequences if the desired action is not completed.</li>
</ol>
</div>
</li>
<li class="flex-1 usa-card--media-right width-full padding-top-3">
<div class="usa-card__container border-0 width-full">
<img class="width-full" src="{{ asset_url('images/phone_grey.svg') }}" role="img" alt="Phone" />
<div class="position-absolute flex text-center padding-5 padding-top-15">
<p class="sms-message-wrapper text-left">{{circle_number(1) }}State Medicare Agency: Hello, MEDICARE has
attempted to
send you an update about your claim, but the mail was returned. <br>{{circle_number(2) }}Please go to
https://www.medicare.gov/account/login?utm_source=TEXT, {{circle_number(3) }}log in to your account, and
click “My
Account Information” to verify that your address is correct. If you are having difficulty logging in,
{{circle_number(4) }}call 1-800-MEDICARE for assistance. {{circle_number(5) }}We will attempt to send the
mail again
in 14 days.
</p>
</div>
</div>
</li>
</ul>
<h2>What provoking action looks like</h2>
<p class="padding-bottom-2"><a class="use-link usa-link--external"
href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC10002044/" target="_blank">Evidence
shows</a> that employing
behavioral science is an effective way to increase the
likelihood of a recipient
taking action upon receiving your text. Keep in mind these three foundational principles while drafting your text
message:</p>
{% set card_contents = [
{
"card_heading": "Feeling a sense of ownership can influence behavior.",
"p_text": "Example <b>Don't miss this chance to get free internet</b> or $30 per month off your internet bill.",
},
{
"card_heading": "Individuals are strongly influenced by others behaviors.",
"p_text": "Example <b>Thousands of residents</b> already get an
average of $113/month in money for food.",
},
{
"card_heading": "Individuals perceive losses more powerfully than gains.",
"p_text": "Example Contact us for potentially unclaimed free
internet services <b>that belong to you</b>.",
},
] %}
{% with card_contents=card_contents, text_align='left' %}{% include "components/guides/cards.html" %}{%
endwith %}
</section>
{% endblock %}

View File

@@ -0,0 +1,110 @@
{% extends "base.html" %}
{% from "components/table.html" import mapping_table, row, text_field, edit_field, field with context %}
{% from "components/sub-navigation.html" import sub_navigation %}
{% from "components/service-link.html" import service_link %}
{% block per_page_title %}
How to
{% endblock %}
{% block content_column_content %}
<h1 class="font-body-2xl margin-bottom-3">How to</h1>
<p>Notify allows you to easily create templates for messages for your recipients. You can customize messages to encourage
your recipient to manage their benefits and increase follow-through.</p>
<p>Below we explain how to:</p>
<ul class="list list-bullet">
<li><a class="usa-link" href="#personalize-content">Personalize your content</a></li>
<li><a class="usa-link" href="#conditional-content">Add conditional content</a></li>
</ul>
{# Format content #}
<h2 class="padding-top-1" id="format-content">Format your content</h2>
<h3>To create and format your message</h3>
<ol class="list">
<li>All messages start from a template</li>
<li>Click "<a href={{ url_for('.choose_template', service_id=current_service.id) }}>Send Messages</a>". You'll see existing templates.</li>
<li>Add a new template or choose an existing template and select Edit.</li>
</ol>
{# Add links #}
<p>When composing a text message, links to websites or online applications can help your recipient respond quickly.</p>
<ul class="list list-bullet">
<li>Write URLs in full and Notify will convert them into links for you. Note that you cannot hyperlink text in Notify
messages.</li>
<li>For link click tracking, you can consider adding campaign parameters to URLs.</li>
<li>All links should point to a government domain.</li>
<li>Link directly to where your recipient needs to take action, not to more information.</li>
</ul>
<h3>About link-shortening services</h3>
<p>We do not recommend using a third-party link-shortening service because:</p>
<ul class="list list-bullet">
<li>Your recipient cannot see where the link will take them, which could make them suspect the link is spam/scam.</li>
<li>Your link might stop working if theres a service outage.</li>
<li>You can no longer control where the redirect goes.</li>
</ul>
{# Personalize content #}
<h2 class="padding-top-1" id="personalize-content">Personalize your content</h2>
<p>Personalizing your content can increase response rates and help the recipient know the text is legitimate.</p>
<ul class="list list-bullet">
<li>Including a person's first name increases response rates.</li>
<li>Specific details such as time and location of an appointment or where suspected fraud use occurred encourages action.</li>
</ul>
<h3>To personalize your content</h3>
<ol class="list">
<li>Add a placeholder to your content by placing two brackets around the personalized elements.</li>
<li>You can manually enter the personalized content or you can upload a spreadsheet with the details and let Notify do the
work for you.</li>
</ol>
<h4>Example</h4>
<p>To personalize with the recipient's first name and include a reference number:</p>
<p class="padding-2 bg-base-lightest">State WIC: Hello ((first name)), your reference is ((ref number)). Please provide this number when you call 555-123-1234 to make an appointment.</p>
<p>Note that variations in the length of personalized content can impact the length of specific messages, and may affect
the number of parts used.</p>
{# Add conditional content #}
<h2 class="padding-top-1" id="conditional-content">Add conditional content</h2>
<p>Conditional (or optional) content appears only when a recipient meets certain criteria. This feature allows you to make
all or part of the message contingent upon specific criteria associated with the recipient.</p>
<h3>To add conditional content</h3>
<ol class="list">
<li>Use two brackets and ?? to define the conditional content.</li>
<li>You can manually enter the conditional content or you can upload a spreadsheet with the personal details and let Notify
do the work for you.</li>
</ol>
<h4>Examples</h4>
<ol class="list">
<li>If you only want to show something to people who are under 18:
</br>
<p class="padding-2 bg-base-lightest">State SNAP: Renewal applications are due by March 15. ((under18??Please get your application signed by a parent or
guardian.))</p>
</li>
<li>
If you want to make people who are homebound aware of the option of virtual visits (but not other message recipients):
</br>
<p class="padding-2 bg-base-lightest">State Medicaid: Please call 555-123-1234 to schedule an appointment. ((homebound??Virtual visits are available.))</p>
</li>
<li>
If you want to send a messages in different languages to different recipients:
</br>
<p class="padding-2 bg-base-lightest">((English??Weve identified unauthorized use on your EBT account. Call the phone number on the back of your card to
cancel or go to your local CSO for immediate replacement.))((Spanish??Hemos identificado un uso no autorizado en su
cuenta EBT. Llame al número de teléfono que aparece en el reverso de su tarjeta para cancelarla o diríjase a su CSO
local para que se la sustituyan inmediatamente.))</p>
</li>
</ol>
...
{% endblock %}

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