Skip to content

Frontend/psypact scaffold - #1938

Open
jsandoval81 wants to merge 8 commits into
csg-org:mainfrom
InspiringApps:frontend/psypact-scaffold
Open

jsandoval81 wants to merge 8 commits into
csg-org:mainfrom
InspiringApps:frontend/psypact-scaffold

Conversation

@jsandoval81

Copy link
Copy Markdown
Collaborator

Requirements List

  • .env new variables:
    •  VUE_APP_API_STATE_ROOT_PSYPACT=https://api.test.psypact.jcc.iaapi.io
       VUE_APP_API_LICENSE_ROOT_PSYPACT=https://api.test.psypact.jcc.iaapi.io
       VUE_APP_API_SEARCH_ROOT_PSYPACT=https://search.test.psypact.jcc.iaapi.io
       VUE_APP_API_USER_ROOT_PSYPACT=https://api.test.psypact.jcc.iaapi.io
       ...
       VUE_APP_COGNITO_AUTH_DOMAIN_STAFF_PSYPACT=https://staff-auth.test.psypact.jcc.iaapi.io
       VUE_APP_COGNITO_CLIENT_ID_STAFF_PSYPACT=7j8edjf4p4dppq5aniq38r3e7f
       VUE_APP_COGNITO_AUTH_DOMAIN_LICENSEE_PSYPACT=https://licensee-auth.test.psypact.jcc.iaapi.io
       VUE_APP_COGNITO_CLIENT_ID_LICENSEE_PSYPACT=264639h8fgdggvt29r7ldggn5u
      

Description List

  • Added Psypact compact basic capability, including:
    • New App mode & group mode
    • Capability for Psypact mode to auto-trigger based on host domain
    • Staff login
    • Provider login
    • Public UI including basic search
    • Staff UI including basic multi-state UI & user admin
    • Backend CSP config
    • Updated docs
  • Added a local-only mode switcher dropdown on PublicDashboard page to help test CompactConnect vs. Psypact modes
  • Expanded some existing MVP functionality to more robust patterns in order to support Psypact's requirements of:
    • Multi-state compact w/ provider registration
    • Pinned app mode
  • Factored the LicenseCard & PrivilegeCard admin actions into a reusable component
  • Updated Auth URIs to use the hostname, rather than a hardcoded domain
  • Not included yet (still waiting on spec)
    • Psypact provider registration UI
    • Psypact MFA reset UI
    • Psypact Applications UI

Testing List

  • yarn test:unit:all should run without errors or warnings
  • yarn serve should run without errors or warnings
  • yarn build should run without errors or warnings
  • Code review
  • Test app in Psypact mode
    • App should just have basic multi-state compact functionality at this point
    • The PublicDashboard should be a separate Psypact version when in Psypact mode
    • The Privacy Policy should say "PSYPACT" as needed
  • Test app in CompactConnect mode
    • The PublicDashboard should be the original CompactConnect version
    • The Privacy Policy should say "CompactConnect" as needed
    • All of the provider and staff functionality for all CompactConnect compacts should continue to work as expected without regressions

Closes #1860

@coderabbitai

coderabbitai Bot commented Sep 23, 2026 •

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 120 files, which is 20 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 082f1fbe-bdfc-4b0f-bb75-fd1d8ca964df

📥 Commits

Reviewing files that changed from the base of the PR and between 9f4d2df and 0ea8c4e.

⛔ Files ignored due to path filters (2)
  • webroot/src/assets/logos/psypact-logo-white.svg is excluded by !**/*.svg
  • webroot/src/assets/logos/psypact-logo.png is excluded by !**/*.png
📒 Files selected for processing (120)
  • .github/workflows/check-webroot.yml
  • backend/common-cdk/common_constructs/frontend_app_config_utility.py
  • backend/common-cdk/tests/test_frontend_app_config_utility.py
  • backend/compact-connect-ui-app/lambdas/nodejs/cloudfront-csp/index.js
  • backend/compact-connect-ui-app/lambdas/nodejs/cloudfront-csp/test/index.test.js
  • backend/compact-connect-ui-app/stacks/frontend_deployment_stack/__init__.py
  • backend/compact-connect-ui-app/stacks/frontend_deployment_stack/deployment.py
  • backend/compact-connect-ui-app/stacks/frontend_deployment_stack/distribution.py
  • backend/compact-connect-ui-app/tests/resources/snapshots/BetaFrontend-FrontendDeploymentStack-UI_DISTRIBUTION.json
  • backend/compact-connect-ui-app/tests/resources/snapshots/BetaFrontend-FrontendDeploymentStack-UI_DISTRIBUTION_LAMBDA_FUNCTION.json
  • backend/compact-connect-ui-app/tests/resources/snapshots/ProdFrontend-FrontendDeploymentStack-UI_DISTRIBUTION.json
  • backend/compact-connect-ui-app/tests/resources/snapshots/ProdFrontend-FrontendDeploymentStack-UI_DISTRIBUTION_LAMBDA_FUNCTION.json
  • backend/compact-connect-ui-app/tests/resources/snapshots/SandboxUI-FrontendDeploymentStack-UI_DISTRIBUTION.json
  • backend/compact-connect-ui-app/tests/resources/snapshots/SandboxUI-FrontendDeploymentStack-UI_DISTRIBUTION_LAMBDA_FUNCTION.json
  • backend/compact-connect-ui-app/tests/resources/snapshots/TestFrontend-FrontendDeploymentStack-UI_DISTRIBUTION.json
  • backend/compact-connect-ui-app/tests/resources/snapshots/TestFrontend-FrontendDeploymentStack-UI_DISTRIBUTION_LAMBDA_FUNCTION.json
  • webroot/.env.example
  • webroot/AGENTS.md
  • webroot/README.md
  • webroot/docs/ADD_COMPACT.md
  • webroot/src/app.config.ts
  • webroot/src/components/App/App.spec.ts
  • webroot/src/components/App/App.ts
  • webroot/src/components/AppTypeSelector/AppTypeSelector.less
  • webroot/src/components/AppTypeSelector/AppTypeSelector.spec.ts
  • webroot/src/components/AppTypeSelector/AppTypeSelector.ts
  • webroot/src/components/AppTypeSelector/AppTypeSelector.vue
  • webroot/src/components/AutoLogout/AutoLogout.spec.ts
  • webroot/src/components/AutoLogout/AutoLogout.ts
  • webroot/src/components/CompactSettingsConfig/CompactSettingsConfig.vue
  • webroot/src/components/LicenseActionsModal/LicenseActionsModal.less
  • webroot/src/components/LicenseActionsModal/LicenseActionsModal.spec.ts
  • webroot/src/components/LicenseActionsModal/LicenseActionsModal.ts
  • webroot/src/components/LicenseActionsModal/LicenseActionsModal.vue
  • webroot/src/components/LicenseCard/LicenseCard.less
  • webroot/src/components/LicenseCard/LicenseCard.ts
  • webroot/src/components/LicenseCard/LicenseCard.vue
  • webroot/src/components/Licensee/LicenseeList/LicenseeList.ts
  • webroot/src/components/Licensee/LicenseeListLegacy/LicenseeListLegacy.ts
  • webroot/src/components/Licensee/LicenseeSearch/LicenseeSearch.ts
  • webroot/src/components/Licensee/LicenseeSearchLegacy/LicenseeSearchLegacy.ts
  • webroot/src/components/Licensee/PracticeStates/PracticeStates.less
  • webroot/src/components/Licensee/PracticeStates/PracticeStates.spec.ts
  • webroot/src/components/Licensee/PracticeStates/PracticeStates.ts
  • webroot/src/components/Licensee/PracticeStates/PracticeStates.vue
  • webroot/src/components/Page/PageHeader/PageHeader.less
  • webroot/src/components/Page/PageHeader/PageHeader.vue
  • webroot/src/components/Page/PageMainNav/PageMainNav.less
  • webroot/src/components/Page/PageMainNav/PageMainNav.ts
  • webroot/src/components/Page/PageMainNav/PageMainNav.vue
  • webroot/src/components/PrivilegeCard/PrivilegeCard.less
  • webroot/src/components/PrivilegeCard/PrivilegeCard.ts
  • webroot/src/components/PrivilegeCard/PrivilegeCard.vue
  • webroot/src/components/PrivilegePurchaseSelect/PrivilegePurchaseSelect.ts
  • webroot/src/components/StateUpload/StateUpload.spec.ts
  • webroot/src/locales/en.json
  • webroot/src/locales/es.json
  • webroot/src/models/License/License.model.ts
  • webroot/src/network/apiUrls.spec.ts
  • webroot/src/network/apiUrls.ts
  • webroot/src/network/mocks/mock.data.api.ts
  • webroot/src/network/mocks/mock.data.spec.ts
  • webroot/src/network/mocks/mock.data.ts
  • webroot/src/pages/AuthCallback/LicenseePsyPact/LicenseePsyPact.less
  • webroot/src/pages/AuthCallback/LicenseePsyPact/LicenseePsyPact.spec.ts
  • webroot/src/pages/AuthCallback/LicenseePsyPact/LicenseePsyPact.ts
  • webroot/src/pages/AuthCallback/LicenseePsyPact/LicenseePsyPact.vue
  • webroot/src/pages/AuthCallback/StaffPsyPact/StaffPsyPact.less
  • webroot/src/pages/AuthCallback/StaffPsyPact/StaffPsyPact.spec.ts
  • webroot/src/pages/AuthCallback/StaffPsyPact/StaffPsyPact.ts
  • webroot/src/pages/AuthCallback/StaffPsyPact/StaffPsyPact.vue
  • webroot/src/pages/AuthCallback/_mixins/handler.mixin.ts
  • webroot/src/pages/AuthCallback/_mixins/mixins.spec.ts
  • webroot/src/pages/CompactSettings/CompactSettings.ts
  • webroot/src/pages/Home/Home.spec.ts
  • webroot/src/pages/Home/Home.ts
  • webroot/src/pages/LicenseeDashboard/LicenseeDashboard.ts
  • webroot/src/pages/LicenseeDashboard/LicenseeDashboard.vue
  • webroot/src/pages/LicenseeProof/LicenseeProof.less
  • webroot/src/pages/LicenseeProof/LicenseeProof.ts
  • webroot/src/pages/LicenseeProof/LicenseeProof.vue
  • webroot/src/pages/LicensingDetail/LicensingDetail.spec.ts
  • webroot/src/pages/LicensingDetail/LicensingDetail.ts
  • webroot/src/pages/LicensingDetail/LicensingDetail.vue
  • webroot/src/pages/Logout/Logout.spec.ts
  • webroot/src/pages/Logout/Logout.ts
  • webroot/src/pages/MfaResetStartLicensee/MfaResetStartLicensee.ts
  • webroot/src/pages/MfaResetStartLicensee/MfaResetStartLicensee.vue
  • webroot/src/pages/PrivacyPolicy/PrivacyPolicy.ts
  • webroot/src/pages/PrivacyPolicy/PrivacyPolicy.vue
  • webroot/src/pages/PublicDashboard/PublicDashboard.less
  • webroot/src/pages/PublicDashboard/PublicDashboard.spec.ts
  • webroot/src/pages/PublicDashboard/PublicDashboard.ts
  • webroot/src/pages/PublicDashboard/PublicDashboard.vue
  • webroot/src/pages/PublicLicensingDetail/PublicLicensingDetail.ts
  • webroot/src/pages/PublicLicensingDetail/PublicLicensingDetail.vue
  • webroot/src/pages/RegisterLicensee/RegisterLicensee.ts
  • webroot/src/pages/RegisterLicensee/RegisterLicensee.vue
  • webroot/src/plugins/Compacts/compacts.d.ts
  • webroot/src/plugins/Compacts/compacts.plugin.ts
  • webroot/src/plugins/Compacts/compacts.spec.ts
  • webroot/src/plugins/EnvConfig/envConfig.plugin.ts
  • webroot/src/router/index.ts
  • webroot/src/router/router.spec.ts
  • webroot/src/router/routes.ts
  • webroot/src/store/global/global.actions.ts
  • webroot/src/store/global/global.getters.ts
  • webroot/src/store/global/global.mutations.ts
  • webroot/src/store/global/global.spec.ts
  • webroot/src/store/global/global.state.ts
  • webroot/src/store/user/user.actions.ts
  • webroot/src/store/user/user.mutations.ts
  • webroot/src/store/user/user.spec.ts
  • webroot/src/store/user/user.state.ts
  • webroot/src/utils/auth.spec.ts
  • webroot/src/utils/auth.ts
  • webroot/src/utils/compactConfig.spec.ts
  • webroot/src/utils/compactConfig.ts
  • webroot/tests/helpers/setup.ts
  • webroot/tests/mocks/mockEnvConfig.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@jsandoval81

Copy link
Copy Markdown
Collaborator Author

@coderabbitai Can you review just the files in /webroot in order to be under your 100-file limit?

@coderabbitai

coderabbitai Bot commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
gh api --paginate repos/csg-org/CompactConnect/pulls/1938/files --jq '.[].filename' | awk 'BEGIN{all=0; webroot=0} {all++; if ($0 ~ /^webroot\//) {webroot++; print}} END {printf "TOTAL_CHANGED=%d\nWEBROOT_CHANGED=%d\n",all,webroot > "/dev/stderr"}'

Length of output: 5067


🤖 web_search executed:

CodeRabbit GitHub pull request review only a directory files path limit 100 @coderabbitai review path filters configuration path_filters changed files limit

Length of output: 13421


🤖 web_search executed:

site:docs.coderabbit.ai @coderabbitai review only specific files folder path PR comment path filter scope 100 file limit

Length of output: 13567


🏁 Script executed:

#!/bin/bash
set -euo pipefail
fd -HI -t f '(^|/)(\.coderabbit\.(yaml|yml)|coderabbit\.(yaml|yml))$' . | while IFS= read -r file; do printf '\n--- %s ---\n' "$file"; rg -n -C5 'path_filters|reviews:|webroot|base:' "$file" || true; done

Length of output: 375


🏁 Script executed:

#!/bin/bash
set -euo pipefail
base=$(gh api repos/csg-org/CompactConnect/pulls/1938 --jq '.base.sha')
printf 'BASE=%s\n' "$base"
git diff --stat "$base"...HEAD -- webroot | tail -n 102
printf '\nCHANGED LINES\n'
git diff --numstat "$base"...HEAD -- webroot | sort -nr | head -n 55

Length of output: 9264


🏁 Script executed:

#!/bin/bash
set -euo pipefail
base=9f4d2dfd9bd61805bf1434a167cd7acb298a3f85
git diff "$base"...HEAD -- webroot/src/app.config.ts webroot/src/components/App/App.ts webroot/src/components/AppTypeSelector/AppTypeSelector.ts webroot/src/network/apiUrls.ts webroot/src/plugins/Compacts/compacts.plugin.ts webroot/src/plugins/EnvConfig/envConfig.plugin.ts webroot/src/router/index.ts webroot/src/router/routes.ts webroot/src/store/global/global.actions.ts webroot/src/store/global/global.getters.ts webroot/src/store/global/global.mutations.ts webroot/src/store/global/global.state.ts webroot/src/store/user/user.actions.ts webroot/src/store/user/user.mutations.ts webroot/src/store/user/user.state.ts webroot/src/utils/auth.ts webroot/src/utils/compactConfig.ts webroot/src/pages/AuthCallback/_mixins/handler.mixin.ts webroot/src/pages/Logout/Logout.ts webroot/src/pages/Home/Home.ts

Length of output: 41501


🏁 Script executed:

#!/bin/bash
set -euo pipefail
ast-grep outline webroot/src/router/index.ts --items all
ast-grep outline webroot/src/components/App/App.ts --items all --match 'created|handleAuth|ensureCompactStates|setAppModeFromCompact'
ast-grep outline webroot/src/utils/auth.ts --items all --match 'getCognitoConfig|getHostedLoginUri|getAuthCallbackPath'
sed -n '25,158p' webroot/src/router/index.ts
sed -n '125,251p' webroot/src/components/App/App.ts
sed -n '132,218p' webroot/src/utils/auth.ts
rg -n -C3 'getHostedLoginUri\s*\(|getCognitoConfig\s*\(' webroot/src --glob '!*.spec.ts'

Length of output: 18090


🏁 Script executed:

#!/bin/bash
set -euo pipefail
base=9f4d2dfd9bd61805bf1434a167cd7acb298a3f85
git diff "$base"...HEAD -- webroot/src/pages/PublicDashboard/PublicDashboard.ts webroot/src/pages/PublicDashboard/PublicDashboard.vue webroot/src/components/AppTypeSelector/AppTypeSelector.vue webroot/src/components/Page/PageMainNav/PageMainNav.vue webroot/src/components/Page/PageHeader/PageHeader.vue webroot/src/pages/PrivacyPolicy/PrivacyPolicy.ts webroot/src/pages/PrivacyPolicy/PrivacyPolicy.vue webroot/src/components/LicenseCard/LicenseCard.ts webroot/src/components/PrivilegeCard/PrivilegeCard.ts | head -n 630
printf '\nDASHBOARD REFERENCES\n'
rg -n -C3 'licenseeLoginUri\s*\(|staffLoginUri\s*\(|isAppModeCosmetology|isAppModeSocialWork|isAppModePsyPact' webroot/src/pages/PublicDashboard webroot/src/pages/MfaResetStartLicensee webroot/src/components/Page/PageMainNav

Length of output: 25820


🏁 Script executed:

#!/bin/bash
set -euo pipefail
base=9f4d2dfd9bd61805bf1434a167cd7acb298a3f85
git diff "$base"...HEAD -- webroot/src/pages/PublicDashboard/PublicDashboard.ts webroot/src/pages/PublicDashboard/PublicDashboard.vue webroot/src/pages/PrivacyPolicy/PrivacyPolicy.ts webroot/src/pages/PrivacyPolicy/PrivacyPolicy.vue
printf '\nDASHBOARD REFERENCES\n'
rg -n -C3 'licenseeLoginUri\s*\(|staffLoginUri\s*\(|isAppModeCosmetology|isAppModeSocialWork|isAppModePsyPact' webroot/src/pages/PublicDashboard webroot/src/pages/MfaResetStartLicensee webroot/src/components/Page/PageMainNav || true

Length of output: 35082


🏁 Script executed:

#!/bin/bash
set -euo pipefail
ast-grep outline webroot/src/components/LicenseActionsModal/LicenseActionsModal.ts --items all --type method --view compact
rg -n -C4 'licenseScope|isCurrentUser.*Admin|shouldAllowNpdbMultiSelect|currentCompactType|submit.*\(' webroot/src/components/LicenseActionsModal/LicenseActionsModal.ts | sed -n '1,260p'
git diff 9f4d2dfd9bd61805bf1434a167cd7acb298a3f85...HEAD -- webroot/src/components/LicenseCard/LicenseCard.vue webroot/src/components/PrivilegeCard/PrivilegeCard.vue | tail -n 140

Length of output: 981


🏁 Script executed:

#!/bin/bash
set -euo pipefail
ast-grep outline webroot/src/components/LicenseActionsModal/LicenseActionsModal.ts --items all --type method --view signatures
rg -n -C3 'licenseScope|isCurrentUser.*Admin|shouldAllowNpdbMultiSelect|currentCompactType|submit.*\(' webroot/src/components/LicenseActionsModal/LicenseActionsModal.ts | sed -n '1,230p'
git diff 9f4d2dfd9bd61805bf1434a167cd7acb298a3f85...HEAD -- webroot/src/components/LicenseCard/LicenseCard.vue webroot/src/components/PrivilegeCard/PrivilegeCard.vue | tail -n 110

Length of output: 14326


🏁 Script executed:

#!/bin/bash
set -euo pipefail
printf 'OLD LICENSE CARD MENU\n'
git show 9f4d2dfd9bd61805bf1434a167cd7acb298a3f85:webroot/src/components/LicenseCard/LicenseCard.vue | rg -n -C6 'isCurrentUserLicenseAdmin|isCurrentUserLicenseStateAdmin|isLicenseActionMenuDisplayed|toggleLicenseActionMenu' | sed -n '1,115p'
printf 'NEW MODAL MENU\n'
sed -n '145,192p' webroot/src/components/LicenseActionsModal/LicenseActionsModal.ts
rg -n -C5 'shouldShowMenu|shouldShowDeactivateMenuItem|shouldShowDisciplineMenuItems|LicenseActionsModal' webroot/src/components/LicenseActionsModal/LicenseActionsModal.vue webroot/src/components/LicenseCard/LicenseCard.vue
printf 'LOGIN LINES\n'
nl -ba webroot/src/utils/auth.ts | sed -n '172,195p'
nl -ba webroot/src/pages/PublicDashboard/PublicDashboard.vue | sed -n '99,111p'

Length of output: 17425


@jsandoval81, I inspected the webroot/ diff without triggering an unscoped PR review. That scope contains 94 changed files. I found one regression in the paths I checked:

Provider login fails in cosmetology and social work modes. webroot/src/pages/PublicDashboard/PublicDashboard.vue Line 105 now calls licenseeLoginUri($appMode). But webroot/src/utils/auth.ts Lines 184–190 supplies licensee Cognito settings only for JCC and PSYPACT. In cosmetology or social work mode, the provider login URL therefore has an empty auth domain and client ID. Keep the existing JCC licensee configuration as the fallback for those modes.

I did not find a permission change in the shared license action menu: its state-admin condition matches the previous LicenseCard condition. This was a focused diff inspection, not an exhaustive review of every line in the 94 files.

You are interacting with an AI system.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PsyPact scaffolding FE

1 participant