diff --git a/src/packages/shared-types/authority.ts b/src/packages/shared-types/authority.ts index b6f82c9289..4c5aff79e6 100644 --- a/src/packages/shared-types/authority.ts +++ b/src/packages/shared-types/authority.ts @@ -6,7 +6,6 @@ export enum Authority { "1915c" = "1915(c)", } -/* Authority values as a union string type. Replaces old Authority enum. */ export type AuthorityUnion = | "Medicaid SPA" | "CHIP SPA" diff --git a/src/services/api/webforms/ABP4/v202401.ts b/src/services/api/webforms/ABP4/v202401.ts index eb8ce237b1..1a24490cd0 100644 --- a/src/services/api/webforms/ABP4/v202401.ts +++ b/src/services/api/webforms/ABP4/v202401.ts @@ -42,49 +42,55 @@ export const v202401: FormSchema = { }, }, { - rhf: "Checkbox", - name: "see-approved-attachment", - rules: { required: "* Required" }, - formItemClassName: - "ml-[0.6rem] px-4 my-2 border-l-4 border-l-primary", - dependency: { - conditions: [ - { - name: "abp4_cost-sharing_abp-for-individuals-income-over-100-poverty", - type: "expectedValue", - expectedValue: "yes", + rhf: "WrappedGroup", + name: "wrapped", + fields: [ + { + rhf: "Checkbox", + name: "see-approved-attachment", + rules: { required: "* Required" }, + formItemClassName: + "ml-[0.6rem] px-4 border-l-4 border-l-primary pb-6", + dependency: { + conditions: [ + { + name: "abp4_cost-sharing_abp-for-individuals-income-over-100-poverty", + type: "expectedValue", + expectedValue: "yes", + }, + ], + effect: { type: "show" }, }, - ], - effect: { type: "show" }, - }, - props: { - options: [ - { - label: - "See approved Attachment 4.18-F or G for description.", - value: "true", + props: { + options: [ + { + label: + "See approved Attachment 4.18-F or G for description.", + value: "true", + }, + ], }, - ], - }, - }, - { - rhf: "Upload", - name: "attachment_upload", - label: "Attachment 4.18-F or G", - labelClassName: "font-bold", - rules: { required: "* Required" }, - formItemClassName: - "ml-[0.6rem] px-4 my-2 border-l-4 border-l-primary", - dependency: { - conditions: [ - { - name: "abp4_cost-sharing_abp-for-individuals-income-over-100-poverty", - type: "expectedValue", - expectedValue: "yes", + }, + { + rhf: "Upload", + name: "attachment_upload", + label: "Attachment 4.18-F or G", + labelClassName: "font-bold", + rules: { required: "* Required" }, + formItemClassName: + "ml-[0.6rem] px-4 border-l-4 border-l-primary", + dependency: { + conditions: [ + { + name: "abp4_cost-sharing_abp-for-individuals-income-over-100-poverty", + type: "expectedValue", + expectedValue: "yes", + }, + ], + effect: { type: "show" }, }, - ], - effect: { type: "show" }, - }, + }, + ], }, { rhf: "Textarea", diff --git a/src/services/api/webforms/ABP6/v202401.ts b/src/services/api/webforms/ABP6/v202401.ts index 666c1ccd04..1c119a1c80 100644 --- a/src/services/api/webforms/ABP6/v202401.ts +++ b/src/services/api/webforms/ABP6/v202401.ts @@ -21,6 +21,9 @@ export const v202401: FormSchema = { label: "Aggregate actuarial value of the benchmark plan (e.g., FEHBP, state/territory employee coverage, commercial plan, state plan) that is equivalent to the state/territory's benefit package", labelClassName: "font-bold", + props: { + icon: "$", + }, rules: { required: "* Required", pattern: { @@ -35,6 +38,9 @@ export const v202401: FormSchema = { label: "Aggregate actuarial value of the state/territory's benchmark-equivalent plan (must be greater than or equal to the amount entered above)", labelClassName: "font-bold", + props: { + icon: "$", + }, rules: { required: "* Required", pattern: { @@ -283,6 +289,9 @@ export const v202401: FormSchema = { { name: "description", rhf: "Textarea", + props: { + className: "h-[114px]", + }, }, ], }, diff --git a/src/services/api/webforms/ABP9/v202401.ts b/src/services/api/webforms/ABP9/v202401.ts index 779bffaa4f..3c78ff17c4 100644 --- a/src/services/api/webforms/ABP9/v202401.ts +++ b/src/services/api/webforms/ABP9/v202401.ts @@ -40,6 +40,9 @@ export const v202401: FormSchema = { label: "Describe the employer-sponsored insurance, including the population covered, amount of premium assistance by population, and employer-sponsored insurance activities, including required contribution, cost-effectiveness test requirements, and benefit information.", labelClassName: "font-bold", + props: { + className: "h-[114px]", + }, dependency: { conditions: [ { @@ -82,6 +85,9 @@ export const v202401: FormSchema = { label: "Describe, including the population covered, amount of premium assistance by population, required contributions, cost-effectiveness test requirements, and benefit information.", labelClassName: "font-bold", + props: { + className: "h-[114px]", + }, dependency: { conditions: [ { @@ -100,6 +106,9 @@ export const v202401: FormSchema = { label: "Other information about employer-sponsored insurance or payment of premiums (optional)", labelClassName: "font-bold", + props: { + className: "h-[114px]", + }, rules: { pattern: { value: /^\S(.*\S)?$/, diff --git a/src/services/email/ses-email-templates/index.js b/src/services/email/ses-email-templates/index.js index 6900973b85..6b91f77620 100644 --- a/src/services/email/ses-email-templates/index.js +++ b/src/services/email/ses-email-templates/index.js @@ -541,11 +541,11 @@ for {{id}} was withdrawn by {{submitterName}} {{submitterEmail}}.

Summary:
{{additionalInformation}}
-

This mailbox is for the submittal of State Plan Amendments and non-web -based responses to Requests for Additional Information (RAI) on submitted -SPAs only. Any other correspondence will be disregarded.

+

This mailbox is for the submittal of Section 1915(b) and 1915(c) Waivers, +responses to Requests for Additional Information (RAI), and extension requests on Waivers only. +Any other correspondence will be disregarded.

If you have questions, please contact -spa@cms.hhs.gov.

+spa@cms.hhs.gov or your state lead.

Thank you!

`, text: ` The OneMAC Submission Portal received a request to withdraw the Formal @@ -560,9 +560,9 @@ Medicaid SPA Package ID: {{id}} Summary: {{additionalInformation}} -This mailbox is for the submittal of State Plan Amendments and non-web -based responses to Requests for Additional Information (RAI) on submitted -SPAs only. Any other correspondence will be disregarded. +This mailbox is for the submittal of Section 1915(b) and 1915(c) Waivers, +responses to Requests for Additional Information (RAI), and extension requests on Waivers only. +Any other correspondence will be disregarded. If you have any questions, please contact spa@cms.hhs.gov or your state lead. diff --git a/src/services/ui/e2e/tests/a11y/index.spec.ts b/src/services/ui/e2e/tests/a11y/index.spec.ts index 2f3cff3c8e..48a23acafd 100644 --- a/src/services/ui/e2e/tests/a11y/index.spec.ts +++ b/src/services/ui/e2e/tests/a11y/index.spec.ts @@ -4,7 +4,6 @@ import AxeBuilder from "@axe-core/playwright"; const staticRoutes = [ "/", "/dashboard", - "/details", "/faq", "/profile", "/new-submission", diff --git a/src/services/ui/package.json b/src/services/ui/package.json index b33c7b45c2..bcd838b282 100644 --- a/src/services/ui/package.json +++ b/src/services/ui/package.json @@ -99,7 +99,7 @@ "serverless-s3-sync": "^3.1.0", "tailwindcss": "^3.3.1", "typescript": "^5.2.0", - "vite": "^4.2.0", + "vite": "^5.3.5", "vite-plugin-radar": "^0.9.2" } } diff --git a/src/services/ui/src/api/submissionService.test.ts b/src/services/ui/src/api/submissionService.test.ts index 36da46cbed..36711d2433 100644 --- a/src/services/ui/src/api/submissionService.test.ts +++ b/src/services/ui/src/api/submissionService.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest"; import * as unit from "./submissionService"; import { OneMacUser } from "@/api/useGetUser"; import { SubmissionServiceEndpoint } from "@/utils"; +import { Authority } from "shared-types"; const mockFormData = { test: "data", @@ -99,10 +100,10 @@ describe("helpers", () => { { test: "data" }, mockGeorge, "/default" as SubmissionServiceEndpoint, - "MEDICAID", + Authority.MED_SPA, mockUploadRecipes(3), ); - expect(payload.authority).toEqual("MEDICAID"); + expect(payload.authority).toEqual("medicaid spa"); expect(payload.origin).toEqual("micro"); expect(payload.attachments).toHaveLength(3); expect(payload.test).toEqual("data"); @@ -115,10 +116,10 @@ describe("helpers", () => { mockFormData, mockGeorge, "/submit", - "MEDICAID", + Authority.MED_SPA, mockUploadRecipes(3), ); - expect(payload.authority).toEqual("MEDICAID"); + expect(payload.authority).toEqual("medicaid spa"); expect(payload.origin).toEqual("micro"); expect(payload.attachments).toHaveLength(3); expect(payload.test).toEqual("data"); diff --git a/src/services/ui/src/api/submissionService.ts b/src/services/ui/src/api/submissionService.ts index 099be0ecca..97c94cccb4 100644 --- a/src/services/ui/src/api/submissionService.ts +++ b/src/services/ui/src/api/submissionService.ts @@ -1,10 +1,10 @@ import { API } from "aws-amplify"; import { Attachment, - Authority, ReactQueryApiError, Action, AttachmentKey, + Authority, } from "shared-types"; import { buildActionUrl, SubmissionServiceEndpoint } from "@/utils"; import { OneMacUser } from "@/api"; @@ -15,7 +15,7 @@ export type SubmissionServiceParameters = { data: T; endpoint: SubmissionServiceEndpoint; user: OneMacUser | undefined; - authority?: Authority; + authority: Authority; }; type SubmissionServiceResponse = { body: { @@ -58,7 +58,7 @@ export const buildSubmissionPayload = >( data: T, user: OneMacUser | undefined, endpoint: SubmissionServiceEndpoint, - authority?: string, + authority: Authority, attachments?: UploadRecipe[], ) => { const userDetails = { diff --git a/src/services/ui/src/api/useGetItem.ts b/src/services/ui/src/api/useGetItem.ts index 9452d91ca3..5b3ee43840 100644 --- a/src/services/ui/src/api/useGetItem.ts +++ b/src/services/ui/src/api/useGetItem.ts @@ -42,7 +42,7 @@ export const useGetItem = ( ); }; -export const useGetItemCache = (id: string) => { +export const useGetItemCache = (id: string | undefined) => { const queryClient = useQueryClient(); const data = (() => { const data = queryClient.getQueryCache().find(["record", id])?.state diff --git a/src/services/ui/src/components/Context/modalContext.tsx b/src/services/ui/src/components/Context/modalContext.tsx index 47dc9e5490..9cfe0ac60e 100644 --- a/src/services/ui/src/components/Context/modalContext.tsx +++ b/src/services/ui/src/components/Context/modalContext.tsx @@ -5,6 +5,7 @@ import { ConfirmationModal } from "@/components"; export type SubmissionAlert = { header: string; body: string; + areButtonsReversed?: boolean; cancelButtonText?: string; acceptButtonText?: string; }; @@ -46,6 +47,7 @@ export const ModalProvider = ({ children }: PropsWithChildren) => { acceptButtonVisible={context.content.acceptButtonText !== undefined} cancelButtonText={context.content.cancelButtonText} acceptButtonText={context.content.acceptButtonText} + areButtonsReversed={context.content.areButtonsReversed} title={context.content.header} body={context.content.body} /> diff --git a/src/services/ui/src/components/Dialog/index.tsx b/src/services/ui/src/components/Dialog/index.tsx index cd2a77d4e9..9951a5a19c 100644 --- a/src/services/ui/src/components/Dialog/index.tsx +++ b/src/services/ui/src/components/Dialog/index.tsx @@ -79,7 +79,7 @@ const DialogFooter = ({ }) => (
(
{icon && ( {icon} )} void; onAccept: () => void; @@ -26,6 +28,7 @@ export function ConfirmationModal({ open, description, title, + areButtonsReversed = false, body, onAccept, onCancel, @@ -42,17 +45,21 @@ export function ConfirmationModal({ {description && {description}} {body &&
{body}
} - - {cancelButtonVisible && ( - - )} + {acceptButtonVisible && ( )} + {cancelButtonVisible && ( + + )} diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts index 7c3d925ac5..af13b2d508 100644 --- a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts +++ b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts @@ -157,10 +157,12 @@ export const useFilterDrawer = () => { (STATE, [KEY, AGG]) => { return { ...STATE, - [KEY]: AGG.buckets.map((BUCK) => ({ - label: `${labelMap[BUCK.key] || BUCK.key}`, - value: BUCK.key, - })), + [KEY]: AGG.buckets + .map((BUCK) => ({ + label: `${labelMap[BUCK.key] || BUCK.key}`, + value: BUCK.key, + })) + .sort((a, b) => Intl.Collator("en").compare(a.value, b.value)), }; }, {} as Record, diff --git a/src/services/ui/src/consts/index.ts b/src/services/ui/src/consts/index.ts index 8a0a2525c1..a5588a31c2 100644 --- a/src/services/ui/src/consts/index.ts +++ b/src/services/ui/src/consts/index.ts @@ -1,2 +1 @@ export * from "./blank-value"; -export * from "./spa-id-regex"; diff --git a/src/services/ui/src/consts/spa-id-regex.ts b/src/services/ui/src/consts/spa-id-regex.ts deleted file mode 100644 index ff5716b7a2..0000000000 --- a/src/services/ui/src/consts/spa-id-regex.ts +++ /dev/null @@ -1 +0,0 @@ -export const SPA_ID_REGEX = /^[A-Z]{2}-\d{2}-\d{4}(-[A-Z0-9]{1,4})?$/; diff --git a/src/services/ui/src/features/dashboard/Lists/renderCells/index.tsx b/src/services/ui/src/features/dashboard/Lists/renderCells/index.tsx index f652d484bf..d547dfedbb 100644 --- a/src/services/ui/src/features/dashboard/Lists/renderCells/index.tsx +++ b/src/services/ui/src/features/dashboard/Lists/renderCells/index.tsx @@ -17,15 +17,19 @@ export const renderCellDate = (key: keyof opensearch.main.Document) => return formatSeatoolDate(data[key] as string); }; -export const renderCellIdLink = (pathResolver: (id: string) => string) => - function Cell(data: opensearch.main.Document) { - const path = pathResolver(encodeURIComponent(data.id)); - return ( - - {data.id} - - ); - }; +type CellIdLinkProps = { + id: string; + authority: Authority; +}; + +export const CellDetailsLink = ({ id, authority }: CellIdLinkProps) => ( + + {id} + +); export const renderCellActions = (user: CognitoUserAttributes | null) => { return function Cell(data: opensearch.main.Document) { diff --git a/src/services/ui/src/features/dashboard/Lists/spas/consts.tsx b/src/services/ui/src/features/dashboard/Lists/spas/consts.tsx index 6479f7e213..8f907e2640 100644 --- a/src/services/ui/src/features/dashboard/Lists/spas/consts.tsx +++ b/src/services/ui/src/features/dashboard/Lists/spas/consts.tsx @@ -3,9 +3,9 @@ import { OsTableColumn } from "@/components"; import { CMS_READ_ONLY_ROLES, UserRoles } from "shared-types"; import { useGetUser } from "@/api"; import { + CellDetailsLink, renderCellActions, renderCellDate, - renderCellIdLink, } from "../renderCells"; import { BLANK_VALUE } from "@/consts"; import { formatSeatoolDate } from "shared-utils"; @@ -35,7 +35,9 @@ export const useSpaTableColumns = (): OsTableColumn[] => { label: "SPA ID", locked: true, transform: (data) => data.id, - cell: renderCellIdLink((id) => `/details?id=${encodeURIComponent(id)}`), + cell: ({ id, authority }) => ( + + ), }, { field: "state.keyword", diff --git a/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx b/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx index 8fc95345da..9bb32a2039 100644 --- a/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx +++ b/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx @@ -4,9 +4,9 @@ import { BLANK_VALUE } from "@/consts"; import { CMS_READ_ONLY_ROLES, UserRoles } from "shared-types"; import { useGetUser } from "@/api"; import { + CellDetailsLink, renderCellActions, renderCellDate, - renderCellIdLink, } from "../renderCells"; import { formatSeatoolDate } from "shared-utils"; @@ -35,7 +35,9 @@ export const useWaiverTableColumns = (): OsTableColumn[] => { label: "Waiver Number", locked: true, transform: (data) => data.id, - cell: renderCellIdLink((id) => `/details?id=${encodeURIComponent(id)}`), + cell: ({ id, authority }) => ( + + ), }, { field: "state.keyword", diff --git a/src/services/ui/src/features/package-actions/ActionPage.tsx b/src/services/ui/src/features/package-actions/ActionPage.tsx index 2a146829f9..72fca89688 100644 --- a/src/services/ui/src/features/package-actions/ActionPage.tsx +++ b/src/services/ui/src/features/package-actions/ActionPage.tsx @@ -1,32 +1,19 @@ -import { - BreadCrumbConfig, - BreadCrumbs, - FAQFooter, - SimplePageContainer, -} from "@/components"; +import { BreadCrumbs, FAQFooter, SimplePageContainer } from "@/components"; import { useParams } from "@/components/Routing"; import { getSetupFor } from "@/features/package-actions/lib"; import { ActionForm } from "@/features/package-actions/ActionForm"; -import { Action } from "shared-types"; -import { actionCrumb, dashboardCrumb, detailsCrumb } from "@/utils"; -const detailsAndActionsCrumbs = ({ - id, - action, -}: { - id: string; - action?: Action; -}): BreadCrumbConfig[] => { - const base = [dashboardCrumb(id), detailsCrumb(id)]; - return !action ? base : [...base, actionCrumb(action, id)]; -}; +import { detailsAndActionsCrumbs } from "@/utils"; + export const ActionPage = () => { const { id, type, authority } = useParams("/action/:authority/:id/:type"); + return ( diff --git a/src/services/ui/src/features/package-actions/actions-breadcrumbs.ts b/src/services/ui/src/features/package-actions/actions-breadcrumbs.ts deleted file mode 100644 index cb93aea458..0000000000 --- a/src/services/ui/src/features/package-actions/actions-breadcrumbs.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Action } from "shared-types"; -import { BreadCrumbConfig } from "@/components"; -import { actionCrumb, dashboardCrumb, detailsCrumb } from "@/utils"; - -export const detailsAndActionsCrumbs = ({ - id, - action, -}: { - id: string; - action?: Action; -}): BreadCrumbConfig[] => { - const base = [dashboardCrumb(id), detailsCrumb(id)]; - return !action ? base : [...base, actionCrumb(action, id)]; -}; diff --git a/src/services/ui/src/features/package-actions/lib/index.ts b/src/services/ui/src/features/package-actions/lib/index.ts index c540172b1d..1f2b393543 100644 --- a/src/services/ui/src/features/package-actions/lib/index.ts +++ b/src/services/ui/src/features/package-actions/lib/index.ts @@ -2,15 +2,17 @@ import { Action, Authority, AuthorityUnion } from "shared-types"; import { getSchemaFor } from "@/features/package-actions/lib/schemaSwitch"; import { getFieldsFor } from "@/features/package-actions/lib/fieldsSwitch"; import { OneMacUser, submit } from "@/api"; -import { buildActionUrl, useOriginPath } from "@/utils"; +import { + buildActionUrl, + getDashboardTabForAuthority, + useOriginPath, +} from "@/utils"; import { Route, useAlertContext, useNavigate } from "@/components"; import { FieldValues } from "react-hook-form"; import { getContentFor } from "@/features/package-actions/lib/contentSwitch"; import { successCheckSwitch } from "./successCheckSwitch"; import { documentPoller } from "@/utils/Poller/documentPoller"; import { stripQueryStringFromURL } from "@/utils/stripQueryString"; -import { SPA_ID_REGEX } from "@/consts"; - export type FormSetup = { schema: ReturnType; fields: ReturnType; @@ -35,7 +37,6 @@ export const submitActionForm = async ({ navigate, originRoute, statusToCheck, - locationState, }: { data: FieldValues; id: string; @@ -54,10 +55,10 @@ export const submitActionForm = async ({ await submit({ data: { ...data, id: id }, endpoint: !actionsThatUseSubmitEndpoint.includes(type) - ? buildActionUrl(type!) // "/action/{type}" + ? buildActionUrl(type) // "/action/{type}" : "/submit", user, - authority: authority, + authority, }); alert.setBannerStyle("success"); alert.setBannerShow(true); @@ -75,8 +76,7 @@ export const submitActionForm = async ({ navigate({ path: strippedPath.path as Route, query: { - ...strippedPath.queryParams, - tab: SPA_ID_REGEX.test(id) ? "spas" : "waivers", + tab: getDashboardTabForAuthority(authority), }, }); } catch (e: unknown) { diff --git a/src/services/ui/src/features/package-actions/lib/modules/temporary-extension/legacy-page.tsx b/src/services/ui/src/features/package-actions/lib/modules/temporary-extension/legacy-page.tsx index 62a99ec9ac..e67de41d93 100644 --- a/src/services/ui/src/features/package-actions/lib/modules/temporary-extension/legacy-page.tsx +++ b/src/services/ui/src/features/package-actions/lib/modules/temporary-extension/legacy-page.tsx @@ -78,19 +78,19 @@ export const TempExtensionWrapper = () => { }; export const TemporaryExtension = () => { - const { type, id } = useParams(); + const { id, authority } = useParams<{ id: string; authority: Authority }>(); const navigationLocation = useMemo( - () => (isNewSubmission() ? "/dashboard?tab=waivers" : `/details?id=${id}`), - [type], + () => + isNewSubmission() + ? "/dashboard?tab=waivers" + : `/details/${authority}/${id}`, + [id, authority], ); const { handleSubmit, formMethods } = useSubmitForm(); - const { id: urlId } = useParams(); - const formId = formMethods.getValues("originalWaiverNumber"); formMethods.setValue("seaActionType", "Extend"); - const parentId = urlId ? urlId : formId; useDisplaySubmissionAlert( "Temporary extension request submitted", "Your submission has been received.", diff --git a/src/services/ui/src/features/package-actions/lib/modules/withdraw-package/index.tsx b/src/services/ui/src/features/package-actions/lib/modules/withdraw-package/index.tsx index 3fd51bcd71..bce70b1e07 100644 --- a/src/services/ui/src/features/package-actions/lib/modules/withdraw-package/index.tsx +++ b/src/services/ui/src/features/package-actions/lib/modules/withdraw-package/index.tsx @@ -73,7 +73,7 @@ export const defaultWithdrawPackageContent: FormContentHydrator = ( header: "Withdraw package?", body: `You are about to withdraw ${document.authority} ${document.id}. Completing this action will conclude the review of this ${document.authority} package. If you are not sure this is the correct action to select, contact your CMS point of contact for assistance.`, acceptButtonText: "Yes, withdraw package", - cancelButtonText: "Return to form", + cancelButtonText: "Cancel", }, successBanner: { header: "Package withdrawn", diff --git a/src/services/ui/src/features/package/index.tsx b/src/services/ui/src/features/package/index.tsx index a5907f26b0..b85b122777 100644 --- a/src/services/ui/src/features/package/index.tsx +++ b/src/services/ui/src/features/package/index.tsx @@ -1,6 +1,5 @@ import { CardWithTopBorder, ErrorAlert, LoadingSpinner } from "@/components"; -import { useQuery } from "@/hooks"; import { useGetItem, useGetItemCache } from "@/api"; import { BreadCrumbs } from "@/components/BreadCrumb"; import { FC, PropsWithChildren } from "react"; @@ -13,7 +12,8 @@ import { PackageStatusCard } from "./package-status"; import { PackageActionsCard } from "./package-actions"; import { useDetailsSidebarLinks } from "./hooks"; import { Authority } from "shared-types"; -import { detailsAndActionsCrumbs } from "@/features/package-actions/actions-breadcrumbs"; +import { Navigate, useParams } from "react-router-dom"; +import { detailsAndActionsCrumbs } from "@/utils"; export const DetailCardWrapper = ({ title, @@ -70,13 +70,19 @@ export const DetailsContent: FC<{ id: string }> = ({ id }) => { }; export const Details = () => { - const query = useQuery(); - const id = query.get("id") as string; + const { id, authority } = useParams<{ + id: string; + authority: Authority; + }>(); + + if (id === undefined || authority === undefined) { + return ; + } return (
- +
@@ -101,7 +107,7 @@ const DetailsSidebar: FC<{ id: string }> = ({ id }) => { }; export const usePackageDetailsCache = () => { - const query = useQuery(); - const id = query.get("id") as string; + const { id } = useParams<{ id: string }>(); + return useGetItemCache(id); }; diff --git a/src/services/ui/src/features/package/package-details/appk.tsx b/src/services/ui/src/features/package/package-details/appk.tsx index d2b894d3e9..b7bc700f3c 100644 --- a/src/services/ui/src/features/package/package-details/appk.tsx +++ b/src/services/ui/src/features/package/package-details/appk.tsx @@ -3,9 +3,8 @@ import { LoadingSpinner, Route, useAlertContext, - useModalContext, } from "@/components"; -import { Authority, SEATOOL_STATUS } from "shared-types"; +import { SEATOOL_STATUS } from "shared-types"; import { useState } from "react"; import * as T from "@/components/Table"; import { Button } from "@/components/Inputs"; @@ -28,11 +27,11 @@ export const AppK = () => { const onChildRemove = async (id: string) => { setLoading(true); - await submission.mutate( + submission.mutate( { data: { id, appkParentId: cache.data.id }, user, - authority: cache.data.authority as Authority, + authority: cache.data.authority, endpoint: "/action/remove-appk-child", }, { diff --git a/src/services/ui/src/features/submission/spa/chip-intitial.tsx b/src/services/ui/src/features/submission/spa/chip-intitial.tsx index 0c1c9f9565..58d6b742cb 100644 --- a/src/services/ui/src/features/submission/spa/chip-intitial.tsx +++ b/src/services/ui/src/features/submission/spa/chip-intitial.tsx @@ -17,7 +17,6 @@ import { import * as Inputs from "@/components/Inputs"; import * as Content from "@/components"; import { useGetUser, submit } from "@/api"; -import { Authority } from "shared-types"; import { zAttachmentOptional, zAttachmentRequired, @@ -32,6 +31,7 @@ import { useQuery as useQueryString } from "@/hooks"; import { SlotAdditionalInfo } from "@/features"; import { documentPoller } from "@/utils/Poller/documentPoller"; import { SubmitAndCancelBtnSection } from "../waiver/shared-components"; +import { Authority } from "shared-types"; const formSchema = z.object({ id: zSpaIdSchema, diff --git a/src/services/ui/src/features/submission/spa/medicaid-initial.tsx b/src/services/ui/src/features/submission/spa/medicaid-initial.tsx index 0f501e042b..da105f937c 100644 --- a/src/services/ui/src/features/submission/spa/medicaid-initial.tsx +++ b/src/services/ui/src/features/submission/spa/medicaid-initial.tsx @@ -1,4 +1,3 @@ -import { useCallback } from "react"; import { useForm, type SubmitHandler } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; @@ -19,7 +18,6 @@ import { } from "@/components"; import * as Content from "@/components"; import { submit } from "@/api"; -import { Authority } from "shared-types"; import { zAttachmentOptional, zAttachmentRequired, @@ -34,6 +32,7 @@ import { FormField } from "@/components/Inputs"; import { SlotAdditionalInfo } from "@/features"; import { documentPoller } from "@/utils/Poller/documentPoller"; import { SubmitAndCancelBtnSection } from "../waiver/shared-components"; +import { Authority } from "shared-types"; const formSchema = z.object({ id: zSpaIdSchema, diff --git a/src/services/ui/src/features/submission/waiver/shared-components/SubmitAndCancelBtnSection.tsx b/src/services/ui/src/features/submission/waiver/shared-components/SubmitAndCancelBtnSection.tsx index 9c8115aca5..7bf33a1f85 100644 --- a/src/services/ui/src/features/submission/waiver/shared-components/SubmitAndCancelBtnSection.tsx +++ b/src/services/ui/src/features/submission/waiver/shared-components/SubmitAndCancelBtnSection.tsx @@ -70,6 +70,7 @@ export const SubmitAndCancelBtnSection = ({ body: "All information you've entered on this form will be lost if you leave this page.", acceptButtonText: "Yes, leave form", cancelButtonText: "Return to form", + areButtonsReversed: true, }); modal.setOnAccept(() => acceptAction); modal.setModalOpen(true); diff --git a/src/services/ui/src/router.tsx b/src/services/ui/src/router.tsx index 646fabd254..279b31c147 100644 --- a/src/services/ui/src/router.tsx +++ b/src/services/ui/src/router.tsx @@ -22,7 +22,7 @@ export const router = createBrowserRouter([ element: , loader: F.dashboardLoader(queryClient), }, - { path: "/details", element: }, + { path: "/details/:authority/:id", element: }, { path: "/new-submission", element: , diff --git a/src/services/ui/src/utils/crumbs.ts b/src/services/ui/src/utils/crumbs.ts index 318410f270..dc1e009ebe 100644 --- a/src/services/ui/src/utils/crumbs.ts +++ b/src/services/ui/src/utils/crumbs.ts @@ -1,25 +1,61 @@ -import { BreadCrumbConfig, Route, urlEmbedQuery } from "@/components"; -import { SPA_ID_REGEX } from "@/consts"; +import { BreadCrumbConfig, Route } from "@/components"; import { mapActionLabel, mapSubmissionCrumb } from "@/utils"; -import { Action } from "shared-types"; +import { Action, Authority } from "shared-types"; -export const dashboardCrumb = (id?: string): BreadCrumbConfig => { +type DetailsAndActionsBreadCrumbsArgs = { + id: string; + authority: Authority; + actionType?: Action; +}; + +export const getDashboardTabForAuthority = ( + authority: Authority, +): "spas" | "waivers" => { + switch (authority) { + case "CHIP SPA" as Authority: + case "Medicaid SPA" as Authority: + return "spas"; + case "1915(b)": + case "1915(c)": + return "waivers"; + default: + throw new Error("Invalid authority"); + } +}; + +export const detailsAndActionsCrumbs = ({ + id, + authority, + actionType, +}: DetailsAndActionsBreadCrumbsArgs): BreadCrumbConfig[] => { + const defaultBreadCrumbs = [ + dashboardCrumb(authority), + detailsCrumb(id, authority), + ]; + + return actionType + ? [...defaultBreadCrumbs, actionCrumb(actionType, id)] + : defaultBreadCrumbs; +}; + +export const dashboardCrumb = (authority?: Authority): BreadCrumbConfig => { return { displayText: "Dashboard", order: 1, default: true, - to: id - ? urlEmbedQuery("/dashboard", { - tab: SPA_ID_REGEX.test(id) ? "spas" : "waivers", - }) + to: authority + ? `/dashboard?tab=${getDashboardTabForAuthority(authority)}` : "/dashboard", }; }; -export const detailsCrumb = (id: string): BreadCrumbConfig => ({ +export const detailsCrumb = ( + id: string, + authority: Authority, +): BreadCrumbConfig => ({ displayText: id, order: 2, - to: `/details?id=${id}`, + to: `/details/${authority}/${id}`, }); export const actionCrumb = (action: Action, id: string): BreadCrumbConfig => ({ diff --git a/src/services/ui/src/utils/formOrigin.ts b/src/services/ui/src/utils/formOrigin.ts index 28e3fc12a7..69292df7e5 100644 --- a/src/services/ui/src/utils/formOrigin.ts +++ b/src/services/ui/src/utils/formOrigin.ts @@ -17,12 +17,17 @@ export const originRoute: Record = { */ export const useOriginPath = () => { const urlQuery = useQueryString(); - const { id } = useParams("/action/:id/:type"); + const origin = urlQuery.get(ORIGIN) as Origin | null; + + const { id, authority } = useParams("/action/:authority/:id/:type"); + return useMemo(() => { - const origin = urlQuery.get(ORIGIN) as Origin | null; - if (!origin || !originRoute[origin]) return null; + if (!origin || !originRoute[origin]) { + return null; + } + return origin === "actionsDetails" - ? (`${originRoute[origin]}?id=${id}` as Route) - : (originRoute[origin] as Route); - }, []); + ? `${originRoute[origin]}/${authority}/${id}` + : originRoute[origin]; + }, [authority, id, origin]); }; diff --git a/src/services/ui/src/utils/index.ts b/src/services/ui/src/utils/index.ts index 9b3796bca5..dd0644f5ac 100644 --- a/src/services/ui/src/utils/index.ts +++ b/src/services/ui/src/utils/index.ts @@ -2,7 +2,6 @@ export * from "./createContextProvider"; export * from "./date"; export * from "./stateNames"; export * from "./textHelpers"; -export * from "./createContextProvider"; export * from "./labelMappers"; export * from "./user"; export * from "./TestWrapper"; diff --git a/yarn.lock b/yarn.lock index 6616901056..348454c937 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3532,11 +3532,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== -"@esbuild/android-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" - integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== - "@esbuild/android-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" @@ -3547,11 +3542,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== -"@esbuild/android-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" - integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== - "@esbuild/android-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" @@ -3562,11 +3552,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== -"@esbuild/android-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" - integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== - "@esbuild/android-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" @@ -3577,11 +3562,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== -"@esbuild/darwin-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" - integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== - "@esbuild/darwin-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" @@ -3592,11 +3572,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== -"@esbuild/darwin-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" - integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== - "@esbuild/darwin-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" @@ -3607,11 +3582,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== -"@esbuild/freebsd-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" - integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== - "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" @@ -3622,11 +3592,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== -"@esbuild/freebsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" - integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== - "@esbuild/freebsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" @@ -3637,11 +3602,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== -"@esbuild/linux-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" - integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== - "@esbuild/linux-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" @@ -3652,11 +3612,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== -"@esbuild/linux-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" - integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== - "@esbuild/linux-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" @@ -3667,11 +3622,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== -"@esbuild/linux-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" - integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== - "@esbuild/linux-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" @@ -3682,11 +3632,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== -"@esbuild/linux-loong64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" - integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== - "@esbuild/linux-loong64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" @@ -3697,11 +3642,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== -"@esbuild/linux-mips64el@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" - integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== - "@esbuild/linux-mips64el@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" @@ -3712,11 +3652,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== -"@esbuild/linux-ppc64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" - integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== - "@esbuild/linux-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" @@ -3727,11 +3662,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== -"@esbuild/linux-riscv64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" - integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== - "@esbuild/linux-riscv64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" @@ -3742,11 +3672,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== -"@esbuild/linux-s390x@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" - integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== - "@esbuild/linux-s390x@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" @@ -3757,11 +3682,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== -"@esbuild/linux-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" - integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== - "@esbuild/linux-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" @@ -3772,11 +3692,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== -"@esbuild/netbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" - integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== - "@esbuild/netbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" @@ -3787,11 +3702,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== -"@esbuild/openbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" - integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== - "@esbuild/openbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" @@ -3802,11 +3712,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== -"@esbuild/sunos-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" - integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== - "@esbuild/sunos-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" @@ -3817,11 +3722,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== -"@esbuild/win32-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" - integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== - "@esbuild/win32-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" @@ -3832,11 +3732,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== -"@esbuild/win32-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" - integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== - "@esbuild/win32-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" @@ -3847,11 +3742,6 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== -"@esbuild/win32-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" - integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== - "@esbuild/win32-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" @@ -9290,34 +9180,6 @@ es6-weak-map@^2.0.3: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -esbuild@^0.18.10: - version "0.18.20" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" - integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== - optionalDependencies: - "@esbuild/android-arm" "0.18.20" - "@esbuild/android-arm64" "0.18.20" - "@esbuild/android-x64" "0.18.20" - "@esbuild/darwin-arm64" "0.18.20" - "@esbuild/darwin-x64" "0.18.20" - "@esbuild/freebsd-arm64" "0.18.20" - "@esbuild/freebsd-x64" "0.18.20" - "@esbuild/linux-arm" "0.18.20" - "@esbuild/linux-arm64" "0.18.20" - "@esbuild/linux-ia32" "0.18.20" - "@esbuild/linux-loong64" "0.18.20" - "@esbuild/linux-mips64el" "0.18.20" - "@esbuild/linux-ppc64" "0.18.20" - "@esbuild/linux-riscv64" "0.18.20" - "@esbuild/linux-s390x" "0.18.20" - "@esbuild/linux-x64" "0.18.20" - "@esbuild/netbsd-x64" "0.18.20" - "@esbuild/openbsd-x64" "0.18.20" - "@esbuild/sunos-x64" "0.18.20" - "@esbuild/win32-arm64" "0.18.20" - "@esbuild/win32-ia32" "0.18.20" - "@esbuild/win32-x64" "0.18.20" - esbuild@^0.19.3: version "0.19.12" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" @@ -13781,7 +13643,7 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.23, postcss@^8.4.27, postcss@^8.4.31: +postcss@^8.4.23, postcss@^8.4.31: version "8.4.38" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== @@ -14491,13 +14353,6 @@ rimraf@~2.2.8: resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" integrity sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg== -rollup@^3.27.1: - version "3.29.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" - integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== - optionalDependencies: - fsevents "~2.3.2" - rollup@^4.13.0: version "4.18.0" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.18.0.tgz#497f60f0c5308e4602cf41136339fbf87d5f5dda" @@ -15233,7 +15088,16 @@ strict-event-emitter@^0.5.1: resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15311,7 +15175,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -16329,17 +16200,6 @@ vite-plugin-radar@^0.9.2: resolved "https://registry.yarnpkg.com/vite-plugin-radar/-/vite-plugin-radar-0.9.3.tgz#c184897aa8c057fa845f1033a2f977011a8b7c70" integrity sha512-o/7F0gHQW9yUxpExXYwQLxFYOSxiWIPs3Uh24sg+wl5ikghzLKMQ2Xldak/rsT0o06rzdrAqP9+XSOwfCbwz2Q== -vite@^4.2.0: - version "4.5.3" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.3.tgz#d88a4529ea58bae97294c7e2e6f0eab39a50fb1a" - integrity sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg== - dependencies: - esbuild "^0.18.10" - postcss "^8.4.27" - rollup "^3.27.1" - optionalDependencies: - fsevents "~2.3.2" - vite@^5.0.0: version "5.3.3" resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.3.tgz#5265b1f0a825b3b6564c2d07524777c83e3c04c2" @@ -16351,6 +16211,17 @@ vite@^5.0.0: optionalDependencies: fsevents "~2.3.3" +vite@^5.3.5: + version "5.3.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.3.5.tgz#b847f846fb2b6cb6f6f4ed50a830186138cb83d8" + integrity sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.39" + rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" + vitest@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/vitest/-/vitest-2.0.2.tgz#39a4bde8af124c848b4e9098ca339914ebe10ef9" @@ -16546,7 +16417,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -16564,6 +16435,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"