Frontend/cosmetology scaffold#1292
Conversation
- Added the concept of an app-mode to track jcc vs. cosmo switching - @todo: Get actual .env values for API & cognito & begin smoke testing - @todo: Implement interceptors to evaluate which API to call - @todo: Update mock data with cosmo data - @todo: Update ChangePassword component (if needed) - @todo: Add debug component to nav that displays app-mode
- Add debug component to nav that displays app-mode - @todo: Get actual .env values for API & cognito & begin smoke testing - @todo: Implement interceptors to evaluate which API to call - @todo: Update mock data with cosmo data & to handle app mode - @todo: Update ChangePassword component (if needed)
- Update axios dependency for dependabot alert - Update mock data api with minimal support for cosm compact - Continue smoke testing - @todo: Update backend 'bypass' params to support cosm login passthrough - @todo: Update CSP Lambda & related Python with new cosm domains - @todo: Update ChangePassword component (if needed)
- Update backend lambda for the CSP header response - Update backend 'bypass' param for cosmetology staff - Updated frontend README with new .env vars - Continue smoke testing - @todo: Work with backend team to get ui stack configured with cosmetology SSM values - @todo: Work with backend team to resolve issues with `/v1/compacts/cosm` endpoint - @todo: Work with backend team to resolve cognito scopes for pw mgmt for JCC & Cosmo (may be separate PR?) - @todo: Work with backend team to resolve ui_domain_name SSM param for cosmetology (if needed) - @todo: Update ChangePassword UI component (if needed) - @todo: Continue smoke testing
- Work with backend team to get ui stack configured with cosmetology SSM values - Work with backend team to resolve plan for eventual `/v1/compacts/cosm` endpoint - Work with backend team to resolve ui_domain_name SSM param for cosmetology - Continue smoke testing - @todo: Update ChangePassword UI component (if needed) - @todo: Continue smoke testing
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAdds Cosmetology (COSMO) support across frontend and backend: new AppModes and Cognito state types, COSMO environment variables, app-mode-aware login/token flows, network interceptors routing to COSMO APIs, CloudFront CSP updates to allow COSMO domains, locale/UI additions, and CDK/deployment changes to propagate COSMO config. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant Client as Frontend
participant Store as Vuex
participant Router
participant Cognito as CognitoIDP
participant Auth as AuthCallback
participant API as Backend/API
User->>Client: Click "Login (Staff COSMO)"
Client->>Store: dispatch setAppMode(AppModes.COSMETOLOGY)
Client->>Router: navigate to hosted login (state=STAFF_COSMETOLOGY)
Cognito->>User: Authenticate and redirect with code+state
User->>Auth: Browser hits /auth/callback
Auth->>Store: read state -> STAFF_COSMETOLOGY
Auth->>Cognito: getTokensStaffCosmo(code)
Cognito-->>Auth: tokens
Auth->>Store: store tokens, ensure appMode=COSMETOLOGY
Client->>API: Request (interceptor sees appMode COSMETOLOGY)
API->>Backend: Use apiUrl*Cosmo endpoints
Backend-->>Client: response
sequenceDiagram
participant App as App Component
participant Router
participant Store
participant CompactCfg as Compact Config
App->>Router: await ready
Router->>CompactCfg: parse route compact param -> expected AppModes
Router->>Store: if mismatch -> dispatch setAppMode(expected)
Store-->>App: appMode updated (mutation)
App->>App: setAppModeFromCompact(...) and enable debugger
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
webroot/src/pages/MfaResetStartLicensee/MfaResetStartLicensee.ts (1)
109-122:⚠️ Potential issue | 🟠 MajorEnsure the MFA reset backend endpoint supports the
cosmcompact value from cosmetology license types.The
licenseTypeOptionsgetter includes all entries fromlicensing.licenseTypes, which now includes Cosmetologist and Esthetician withcompactKey: 'cosm'. When selected,getCompactFromlicenseType()(line 290) will resolve to'cosm'and pass it to the backend viaprepRequestData(). The frontend validates that a compact value exists (lines 324–325), but the backend must be able to handle thecosmcompact gracefully to prevent opaque failures for cosmetology users.webroot/src/network/licenseApi/data.api.ts (1)
535-548:⚠️ Potential issue | 🟡 Minor
getLicenseeSsnbypasses interceptors and always uses the JCC license URL.This method creates a standalone
axios.getcall withenvConfig.apiUrlLicensehardcoded, bypassing the interceptor-basedbaseURLoverride. WhenappModeisCOSMETOLOGY, this will still hit the JCC endpoint instead ofenvConfig.apiUrlLicenseCosmo.If SSN retrieval is expected to work for Cosmetology licensees, this needs a similar conditional:
Proposed fix
public async getLicenseeSsn(compact: string, licenseeId: string) { // This endpoint requires bypassing our regular error-handler interceptors. const authTokenStaff = authStorage.getItem(tokens.staff.AUTH_TOKEN); const authTokenStaffType = authStorage.getItem(tokens.staff.AUTH_TOKEN_TYPE); - const serverResponse: any = await axios.get(`${envConfig.apiUrlLicense}/v1/compacts/${compact}/providers/${licenseeId}/ssn`, { + const baseUrl = /* determine from store or other mechanism */ envConfig.apiUrlLicense; + const serverResponse: any = await axios.get(`${baseUrl}/v1/compacts/${compact}/providers/${licenseeId}/ssn`, {Note: Since this method doesn't have access to the store (it's not passed through), you'd need to either pass the store/appMode into the method or find another way to resolve the correct base URL. This may be fine to defer if Cosmetology SSN retrieval isn't needed yet.
🤖 Fix all issues with AI agents
In `@webroot/README.md`:
- Around line 175-182: The README has inconsistent formatting for the
VUE_APP_COGNITO_CLIENT_ID_STAFF_COSMO entries: change the Beta value from plain
TODO to inline code by wrapping it in backticks (i.e., make it `TODO`) so it
matches the other TODO entries and the surrounding entries for
VUE_APP_COGNITO_CLIENT_ID_STAFF_COSMO.
In `@webroot/src/components/App/App.ts`:
- Around line 115-127: The guard in setAppModeFromCompact prevents re-evaluating
the route compact type because globalStore.appMode is never reset on logout;
update the logout/session-clear flow so appMode is cleared so
setAppModeFromCompact (and subsequent calls to
this.$store.dispatch('setAppMode', ...)) can re-run: either add appMode to the
STORE_RESET_GLOBAL mutation so it resets to null/undefined on logout, or
explicitly clear appMode in clearSessionStores during session teardown; ensure
CompactType and AppModes logic remains the same so route compact types are
honored on each new login.
In `@webroot/src/pages/AuthCallback/AuthCallback.ts`:
- Around line 81-107: The fallback token-fetching sequence (methods
getTokensStaffJcc, getTokensStaffCosmo, getTokensLicenseeJcc) never dispatches
setAppMode, so store.state.appMode remains default and interceptors use wrong
base URLs; after each successful token fetch in the fallback path, dispatch
setAppMode with the corresponding mode (e.g., JCC or COSMO) and update any
related state used by the interceptors so subsequent API calls use the correct
base URL, and ensure you only set isError = true if all token attempts fail.
In `@webroot/src/pages/PublicDashboard/PublicDashboard.vue`:
- Around line 89-100: The aria-label for the COSMO staff login button does not
match the visible text (visible includes "COSMO" but aria-label uses
$t('navigation.loginAsStaff')), violating label-in-name; update the accessible
name so it includes "COSMO" — either add a new i18n key like
navigation.loginAsStaffCosmo and use
:aria-label="$t('navigation.loginAsStaffCosmo')" for the element that uses
bypassToStaffLoginCosmo (and mirror this for the non-mock anchor that
concatenates COSMO), or concatenate the translated string with " COSMO" in the
aria-label so the aria-label matches the visible text while keeping the
click/keyup handlers (bypassToStaffLoginCosmo) and StaffUserIcon intact.
In `@webroot/src/store/global/global.state.ts`:
- Line 29: The boolean default for the debug flag isAppModeDisplayed should be
switched off for release: change its initializer from true to false in the
global state object (isAppModeDisplayed: false) and update the TODO comment to
indicate it is intentionally disabled for production; also scan for any code
that programmatically toggles isAppModeDisplayed on initialization (e.g., code
that reads from dev configs or env vars) and ensure those paths are guarded so
the debug display remains disabled by default.
🧹 Nitpick comments (8)
.github/workflows/check-webroot.yml (1)
57-66: Consider upgrading pinned GitHub Actions to current major versions.
actions/checkout@v2andactions/setup-node@v1are significantly outdated (current majors are v4). Older versions may lack security patches and features. This is pre-existing, so no need to address in this PR, but worth tracking.webroot/src/pages/AuthCallback/AuthCallback.ts (1)
62-65:setAppModedispatches are not awaited before proceeding to token fetch.On lines 67, 72, and 77,
this.$store.dispatch('setAppMode', ...)is called withoutawait. If the interceptors or any downstream code readsappModeduring the token fetch, it might see a stale value. SincegetTokensStaffJcc/getTokensStaffCosmo/getTokensLicenseeJccuseaxios.postdirectly (not the store-intercepted axios), this is likely fine in practice, but it's worth noting for consistency.webroot/src/components/CompactSelector/CompactSelector.ts (1)
149-153: Minor: missingawaitondispatch('setAppMode', ...).Line 148 uses
awaiton the preceding dispatch, but lines 150/152 fire-and-forget. For consistency and to ensure ordering, consider awaiting these as well.♻️ Suggested fix
- if (selectedCompactType === CompactType.COSMETOLOGY) { - this.$store.dispatch('setAppMode', AppModes.COSMETOLOGY); - } else { - this.$store.dispatch('setAppMode', AppModes.JCC); - } + if (selectedCompactType === CompactType.COSMETOLOGY) { + await this.$store.dispatch('setAppMode', AppModes.COSMETOLOGY); + } else { + await this.$store.dispatch('setAppMode', AppModes.JCC); + }webroot/src/pages/Logout/Logout.ts (1)
46-46: Nit: getter namehostedLogoutUriStaffis now ambiguous.Since this getter now handles both JCC and COSMO staff logout URIs, the name
hostedLogoutUriStaffdoesn't fully convey its dual-mode behavior. Consider renaming to something likehostedLogoutUriStaffByModein a follow-up, purely for clarity.webroot/src/network/mocks/mock.data.api.ts (1)
605-616: Remove or downgrade the debugconsole.logon Line 609.
console.log('deleting non-cosm staff user compacts')will emit noise in test output and dev console. Consider removing it or gating it behind a verbose/debug flag, consistent with the PR's own TODO to hide AppMode debug display by default.Proposed fix
if (mockStore?.state?.appMode === AppModes.COSMETOLOGY) { - console.log(`deleting non-cosm staff user compacts`); delete account.permissions.octp; delete account.permissions.aslp; delete account.permissions.coun; }webroot/src/components/App/App.ts (1)
234-244: Debug hook onwindow— ensure it's excluded or guarded in production builds.
addAppModeDebugger()is called unconditionally increated(), attachingccModeToggleto the globalwindowobject in all environments. While it only toggles a display flag (low risk), consider gating it behind a dev/non-production check to keep the productionwindowsurface clean.💡 Optional: Guard behind environment check
addAppModeDebugger(): void { + if (this.globalStore.appEnv === 'production') { + return; + } appWindow.ccModeToggle = () => {webroot/src/pages/PublicDashboard/PublicDashboard.spec.ts (1)
62-81: Consider adding a test forhostedLoginUriStaffCosmo.The new
hostedLoginUriStaffCosmocomputed property inPublicDashboard.tsis not covered by any test. Consider adding a test analogous to the existing staff URI test (lines 62-71) to verify the Cosmo staff hosted login URI includes the correct state (e.g.,&state=staff-cosmetologyor equivalentCognitoStateTypes.STAFF_COSMETOLOGYvalue), scope, and callback path.webroot/src/pages/PublicDashboard/PublicDashboard.ts (1)
104-120: Consider extracting a sharedbypassToStaffLoginwith a mode parameter to reduce duplication.
bypassToStaffLogin()andbypassToStaffLoginCosmo()differ only in theAppModesvalue and hosted URI. A single method accepting the mode could serve both bypass cases. Fine to defer since this is scaffold work.💡 Optional: Unified bypass method
- bypassToStaffLogin(): void { - if (this.isUsingMockApi) { - this.mockStaffLogin(AppModes.JCC); - } else { - this.$store.dispatch('startLoading'); - window.location.replace(this.hostedLoginUriStaff); - } - } - - bypassToStaffLoginCosmo(): void { - if (this.isUsingMockApi) { - this.mockStaffLogin(AppModes.COSMETOLOGY); - } else { - this.$store.dispatch('startLoading'); - window.location.replace(this.hostedLoginUriStaffCosmo); - } - } + bypassToStaffLogin(appMode: AppModes = AppModes.JCC): void { + if (this.isUsingMockApi) { + this.mockStaffLogin(appMode); + } else { + const uri = appMode === AppModes.COSMETOLOGY + ? this.hostedLoginUriStaffCosmo + : this.hostedLoginUriStaff; + this.$store.dispatch('startLoading'); + window.location.replace(uri); + } + }Then update
bypassRedirect:case 'login-staff-cosmo': - this.bypassToStaffLoginCosmo(); + this.bypassToStaffLogin(AppModes.COSMETOLOGY); break;
- Set default state of app mode display to false - PR review feedback - @todo: Continue smoke testing
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@backend/cosmetology-app/lambdas/nodejs/package.json`:
- Around line 7-8: Remove the extra leading space before the "fast-xml-parser"
property in package.json so its indentation matches the preceding dependency
line ("@aws-sdk/client-sesv2") — update the line containing "fast-xml-parser":
"5.3.4" to have the same left alignment as the "@aws-sdk/client-sesv2" entry to
fix the whitespace inconsistency.
🧹 Nitpick comments (4)
webroot/src/store/global/global.spec.ts (1)
103-117: Consider also testing withAppModes.COSMO.Both new mutation tests only exercise the
JCCvalue (SET_APP_MODE) ortrue(SET_APP_MODE_DISPLAY). Since COSMO is the new mode being introduced, adding a case that setsAppModes.COSMO(andfalsefor display) would strengthen coverage of the feature this PR adds.webroot/src/pages/AuthCallback/AuthCallback.ts (2)
89-114:.then().catch()chaining means a rejectedsetAppModedispatch would incorrectly incrementerrorCount.If
this.$store.dispatch('setAppMode', ...)inside.then()were to reject, the chained.catch()would catch that rejection and incrementerrorCount, even though the token fetch itself succeeded. This would cause the fallback to incorrectly attempt the next pool (or enter the error state) despite having valid tokens.The risk is low since
setAppModeis likely a simple synchronous mutation, but the control flow conflates token-fetch failures with post-fetch dispatch failures. Separating concerns makes the intent explicit:Proposed fix: isolate setAppMode from the token-fetch error path
- await this.getTokensStaffJcc() - .then(() => { - this.$store.dispatch('setAppMode', AppModes.JCC); - }) - .catch(() => { - errorCount += 1; - }); + await this.getTokensStaffJcc() + .catch(() => { + errorCount += 1; + }); + + if (errorCount === 0) { + this.$store.dispatch('setAppMode', AppModes.JCC); + }Apply the same pattern to the
getTokensStaffCosmoandgetTokensLicenseeJccblocks below.
128-171: Three near-identical token-fetch methods — consider a shared helper.
getTokensStaffJcc,getTokensStaffCosmo, andgetTokensLicenseeJccdiffer only in which env-config keys they read and whichAuthTypesvalue they dispatch. A single parameterized helper would eliminate the duplication and make adding future compacts (e.g., a Cosmetology licensee flow) a one-liner.♻️ Example helper extraction
+ private async fetchTokens( + cognitoAuthDomain: string, + cognitoClientId: string, + authType: string, + ): Promise<void> { + const { domain } = this.$envConfig; + const params = new URLSearchParams(); + + params.append('grant_type', 'authorization_code'); + params.append('client_id', cognitoClientId || ''); + params.append('redirect_uri', `${domain}${this.$route.path}`); + params.append('code', this.authorizationCode); + + const { data } = await axios.post(`${cognitoAuthDomain}/oauth2/token`, params); + + await this.$store.dispatch('user/updateAuthTokens', { tokenResponse: data, authType }); + await this.$store.dispatch('user/loginSuccess', authType); + } + async getTokensStaffJcc(): Promise<void> { - const { domain, cognitoAuthDomainStaff, cognitoClientIdStaff } = this.$envConfig; - const params = new URLSearchParams(); - - params.append('grant_type', 'authorization_code'); - params.append('client_id', cognitoClientIdStaff || ''); - params.append('redirect_uri', `${domain}${this.$route.path}`); - params.append('code', this.authorizationCode); - - const { data } = await axios.post(`${cognitoAuthDomainStaff}/oauth2/token`, params); - - await this.$store.dispatch('user/updateAuthTokens', { tokenResponse: data, authType: AuthTypes.STAFF }); - await this.$store.dispatch('user/loginSuccess', AuthTypes.STAFF); + const { cognitoAuthDomainStaff, cognitoClientIdStaff } = this.$envConfig; + return this.fetchTokens(cognitoAuthDomainStaff, cognitoClientIdStaff, AuthTypes.STAFF); }Repeat for
getTokensStaffCosmoandgetTokensLicenseeJcc.backend/compact-connect-ui-app/stacks/frontend_deployment_stack/distribution.py (1)
132-136: Consider using keyword arguments for clarity.Two of the three parameters share the same type (
PersistentStackFrontendAppConfigValues), so a positional mix-up would be silent. Named arguments make the mapping explicit and guard against accidental transposition.♻️ Suggested change
csp_function_code = generate_csp_lambda_code( - persistent_stack_frontend_app_config_values, - persistent_stack_frontend_app_config_values_cosmetology, - provider_users_stack_frontend_app_config_values + persistent_stack_values=persistent_stack_frontend_app_config_values, + persistent_stack_values_cosmetology=persistent_stack_frontend_app_config_values_cosmetology, + provider_users_stack_values=provider_users_stack_frontend_app_config_values, )
- PR review feedback - @todo: Continue smoke testing
landonshumway-ia
left a comment
There was a problem hiding this comment.
Looks great, just one nit comment but doesn't hold up my approval
backend/compact-connect-ui-app/lambdas/nodejs/cloudfront-csp/test/index.test.js
Outdated
Show resolved
Hide resolved
backend/compact-connect-ui-app/lambdas/nodejs/cloudfront-csp/index.js
Outdated
Show resolved
Hide resolved
backend/compact-connect-ui-app/stacks/frontend_deployment_stack/__init__.py
Show resolved
Hide resolved
- Implement new public dashboard page - Remove cosmetology license types from registration & mfa recovery screens - Remove form subtext from state upload form (csg-org#1293)
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Fix all issues with AI agents
In `@webroot/src/pages/PublicDashboard/PublicDashboard.less`:
- Around line 40-50: The .lower modifier on the splash uses bottom: -5px which
can cause the SVG to overflow or clip; update the .lower rule (and related
.splash-image styling) to remove the negative offset — set bottom: 0 or replace
the negative offset with a non-destructive adjustment such as transform:
translateY( -5px ) on the inner SVG (or adjust stroke alignment/shape-rendering)
so the visual compensation doesn't push the element outside its container;
ensure container overflow handling remains correct if you keep any visual
offset.
In `@webroot/src/pages/PublicDashboard/PublicDashboard.vue`:
- Around line 12-33: The two decorative SVGs (the <svg> elements with class
"splash-image upper" and "splash-image lower" in the PublicDashboard.vue
template) should be marked as non‑interactive for assistive tech; add
aria-hidden="true" to each of those <svg> elements (the ones inside the divs
with class "splash-image-container upper" and "splash-image-container lower") so
screen readers ignore the path data.
🧹 Nitpick comments (2)
webroot/src/pages/RegisterLicensee/RegisterLicensee.ts (1)
88-102: Consider a denylist instead of an allowlist for future-proofing.The hardcoded allowlist means any new compact added to
CompactTypein the future will be silently excluded from registration until a developer remembers to update this array. A denylist approach (e.g., filtering outCompactType.COSMETOLOGY) would automatically include future compacts, which is typically the safer default for a registration flow.That said, the allowlist is more explicit and arguably safer during this scaffolding phase, so this is a minor consideration.
Alternative denylist approach
- const enabledCompacts = [ - CompactType.ASLP, - CompactType.OT, - CompactType.COUNSELING, - ]; - - licenseTypes - .filter((licenseType) => enabledCompacts.includes(licenseType.compactKey)) + const disabledCompacts = [ + CompactType.COSMETOLOGY, + ]; + + licenseTypes + .filter((licenseType) => !disabledCompacts.includes(licenseType.compactKey))webroot/src/pages/PublicDashboard/PublicDashboard.vue (1)
92-169: Consider usingv-forto reduce repetition in compact login buttons.The four compact-type blocks (ASLP, OT, COUNSELING, COSMETOLOGY) share identical structure and only differ in the compact type and the login URI/handler (JCC vs COSMO). This could be driven by a computed array that maps each compact to its URI and handler, reducing ~75 lines of near-duplicate template code.
Understood this is WIP — deferrable if the designs may diverge per compact.
|
@jlkravitz This is ready for your review. |
jlkravitz
left a comment
There was a problem hiding this comment.
few small questions! I'd like to do a full deploy but I may wait for the 'sprint review' and do that in a couple of days (I'll have better internet :))
backend/cosmetology-app/lambdas/nodejs/lib/email/cognito-email-service.ts
Show resolved
Hide resolved
jlkravitz
left a comment
There was a problem hiding this comment.
Looks great, beautiful new home page design!
There was a problem hiding this comment.
🧹 Nitpick comments (1)
backend/compact-connect-ui-app/lambdas/nodejs/package.json (1)
34-36: Security fix via Yarnresolutionsproperly appliedThe
resolutionsoverride pinsfast-xml-parserto version 5.3.6, which addresses two active CVEs in entity expansion and numeric entity processing. Version 5.3.6 is confirmed as the latest release on npm. Theyarn.lockfile has been correctly regenerated with the pinned version.Optional consideration: The exact version pin
"5.3.6"will not automatically absorb future security patch releases. If the intent is to allow patch-level updates while maintaining the security fix, consider using">=5.3.6"instead.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@backend/compact-connect-ui-app/lambdas/nodejs/package.json` around lines 34 - 36, The package.json currently pins fast-xml-parser under the "resolutions" field to the exact version "5.3.6"; if you want to allow future patch-level security fixes while keeping the minimum safe version, change the resolution value for "fast-xml-parser" from "5.3.6" to ">=5.3.6" and then regenerate your lockfile (run yarn install / yarn set version && yarn install as appropriate) so yarn.lock reflects the new range; the key symbols to update are the "resolutions" object and the "fast-xml-parser" entry in package.json and then commit the updated yarn.lock.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@backend/compact-connect-ui-app/lambdas/nodejs/package.json`:
- Around line 34-36: The package.json currently pins fast-xml-parser under the
"resolutions" field to the exact version "5.3.6"; if you want to allow future
patch-level security fixes while keeping the minimum safe version, change the
resolution value for "fast-xml-parser" from "5.3.6" to ">=5.3.6" and then
regenerate your lockfile (run yarn install / yarn set version && yarn install as
appropriate) so yarn.lock reflects the new range; the key symbols to update are
the "resolutions" object and the "fast-xml-parser" entry in package.json and
then commit the updated yarn.lock.
|
@jlkravitz I just resolved merge conflicts + dependency alerts. This is ready for re-approval when you get a chance. |
jlkravitz
left a comment
There was a problem hiding this comment.
@isabeleliassen Good to go!
|
@jlkravitz More merge conflicts just resolved - this will need reapproval once the last check passes. |
Requirements List
DEV_WEBROOT_COGNITO_CLIENT_ID_STAFF_COSMO.envvariablesVUE_APP_API_STATE_ROOT_COSMOVUE_APP_API_LICENSE_ROOT_COSMOVUE_APP_API_SEARCH_ROOT_COSMOVUE_APP_API_USER_ROOT_COSMOVUE_APP_COGNITO_AUTH_DOMAIN_STAFF_COSMOVUE_APP_COGNITO_CLIENT_ID_STAFF_COSMODescription List
AppMode(JCCorCOSMETOLOGY)AppModeand change the outgoing request URI as neededAppModeccModeToggle()Testing List
yarn test:unit:allshould run without errors or warningsyarn serveshould run without errors or warningsyarn buildshould run without errors or warnings/backend/compact-connect-ui-appbin/run_tests.sh -l all -noshould run without errors or warnings.envis updatedAppModeyou can toggle the display of the app mode in the navigation bar by running this in browser console:ccModeToggle()Closes #1281
Closes #1293
Summary by CodeRabbit
New Features
Bug Fixes
Documentation
Other